unix-es
Diferencias
Muestra las diferencias entre dos versiones de la página.
| Ambos lados, revisión anteriorRevisión previaPróxima revisión | Revisión previa | ||
| unix-es [2013/04/25 16:13] – [Manejo de Archivos en Unix] lmateu | unix-es [2016/11/15 13:15] (actual) – [Características de un archivo] lmateu | ||
|---|---|---|---|
| Línea 31: | Línea 31: | ||
| char *buf; | char *buf; | ||
| int fd; | int fd; | ||
| - | | + | |
| + | ssize_t | ||
| leidos = read(fd, buf, nbytes); | leidos = read(fd, buf, nbytes); | ||
| | | ||
| Línea 82: | Línea 83: | ||
| char c; | char c; | ||
| | | ||
| - | return (read(0, &c, 1)==1? | + | return (read(0, &c, 1)==1? c : EOF); |
| } | } | ||
| | | ||
| Línea 88: | Línea 89: | ||
| int c; | int c; | ||
| | | ||
| - | while((c=getchar())!=EOF) | + | while( (c= migetchar()) != EOF) |
| putchar(c); | putchar(c); | ||
| | | ||
| Línea 105: | Línea 106: | ||
| static ssize_t n=0; | static ssize_t n=0; | ||
| | | ||
| - | if(n==0) { /* buffer | + | if(n==0) { /* buffer |
| n=read(0, | n=read(0, | ||
| p=buf; | p=buf; | ||
| } | } | ||
| | | ||
| - | return (--n> | + | return (--n>=0? *p++ : EOF); |
| } | } | ||
| | | ||
| Línea 116: | Línea 117: | ||
| int c; | int c; | ||
| | | ||
| - | while((c=getchar())!=EOF) | + | while( (c= migetchar()) != EOF) |
| putchar(c); | putchar(c); | ||
| return 0; | return 0; | ||
| Línea 172: | Línea 173: | ||
| /* Uso: micp from to */ | /* Uso: micp from to */ | ||
| #include < | #include < | ||
| - | #include <stdlib.h> | + | #include <sys/types.h> |
| - | #include <stdarg.h> | + | #include <sys/stat.h> |
| #include < | #include < | ||
| + | #include < | ||
| #include < | #include < | ||
| + | #include < | ||
| | | ||
| - | | + | |
| - | va_list args; | + | |
| - | + | ||
| - | va_start(args, | + | |
| - | fprintf(stderr, | + | |
| - | vfprintf(stderr, | + | |
| - | fprintf(stderr, | + | |
| - | va_end(args); | + | |
| - | + | ||
| - | exit(1); | + | |
| - | } | + | |
| | | ||
| int main(int argc, char *argv[]) { | int main(int argc, char *argv[]) { | ||
| - | int f1, f2; | + | int in, out; |
| ssize_t n; | ssize_t n; | ||
| - | char buf[BUFSIZ]; | + | char buf[SIZE]; |
| - | + | ||
| - | if (argc!=3) | + | if (argc!=3) |
| - | | + | |
| - | + | | |
| - | if ((f1= open(argv[1], | + | } |
| - | | + | |
| - | + | if ((in= open(argv[1], | |
| - | if ((f2= creat(argv[2], | + | |
| - | | + | |
| - | + | } | |
| + | | ||
| + | if ((out= creat(argv[2], | ||
| + | | ||
| + | | ||
| + | } | ||
| + | | ||
| /* usando stats se pueden mantener los permisos */ | /* usando stats se pueden mantener los permisos */ | ||
| - | | + | |
| - | while ((n= read(f1, buf, BUFSIZ))>0) | + | while ((n= read(in, buf, SIZE))> |
| - | if(write(f2, buf, n)!=n) | + | if (write(out, buf, n)!=n) |
| - | | + | |
| - | + | | |
| + | } | ||
| + | } | ||
| + | |||
| + | if (n<0) { | ||
| + | perror(argv[1]); | ||
| + | exit(5); | ||
| + | } | ||
| + | |||
| + | close(in); | ||
| + | close(out); | ||
| + | | ||
| return 0; | return 0; | ||
| } | } | ||
| + | ==== Cambiar los permisos de un archivo ==== | ||
| + | |||
| + | #include < | ||
| + | char *path; | ||
| + | mod_t mode; | ||
| + | | ||
| + | chmod(path, mode); | ||
| + | |||
| ==== Borrar un archivo ==== | ==== Borrar un archivo ==== | ||
| Línea 220: | Línea 238: | ||
| unlink(path); | unlink(path); | ||
| + | ==== Cambiar el nombre de un archivo ==== | ||
| + | |||
| + | Se usa la funcion //rename//: | ||
| + | |||
| + | #include < | ||
| + | char *oldpath, *newpath; | ||
| + | rename(newpath, | ||
| + | |||
| + | ==== Crear un link duro ==== | ||
| + | |||
| + | Se usa la función //link//: | ||
| + | |||
| + | #include < | ||
| + | char *path, *newpath; | ||
| + | link(path, newpath); | ||
| + | |||
| + | Se usa para crear un nombre sinónimo de un archivo existente. | ||
| + | También se puede crear un link desde el shell de comandos: | ||
| + | |||
| + | % ln datos.txt datos2.txt | ||
| + | |||
| + | En este caso datos.txt y datos2.txt se refieren al mismo archivo. | ||
| + | Si se edita datos.txt y se introduce un cambio, datos2.txt va a reflejar ese cambio. | ||
| + | Si se borra datos.txt, el archivo datos2.txt sigue siendo válido. | ||
| + | |||
| + | También se puede crear un link duro en un directorio distinto del directorio en donde aparece el nombre | ||
| + | original del archivo. | ||
| + | de la misma partición de disco//. | ||
| + | |||
| + | ==== Crear un link simbólico ==== | ||
| + | |||
| + | Se usa la función //symlink// para crear un nombre sinónimo de un archivo existente: | ||
| + | |||
| + | #include < | ||
| + | char *path, *newpath; | ||
| + | symlink(path, | ||
| + | |||
| + | También se puede crear un link simbólico desde el shell de comandos: | ||
| + | |||
| + | % ln -s datos.txt datos2.txt | ||
| + | |||
| + | En este caso datos2.txt es un nombre alternativo para datos.txt. | ||
| + | ¡Pero cuidado! | ||
| + | es que si se borra datos.txt, datos2.txt ya no es válido. | ||
| + | |||
| + | La ventaja con respecto a los links duros es que sí se pueden crear links simbólicos | ||
| + | con el nuevo nombre en una partición distinta de la partición en donde se ubica el | ||
| + | nombre original. | ||
| ==== Acceso directo ==== | ==== Acceso directo ==== | ||
| Línea 264: | Línea 330: | ||
| | | ||
| buf= getcwd(buf, size); /* guarda en buf pathname absoluto del | buf= getcwd(buf, size); /* guarda en buf pathname absoluto del | ||
| - | directorio actual, retorna NULL si error */ | + | directorio actual, retorna NULL en caso de error */ |
| + | chdir(name); | ||
| Llamadas al sistema (sección 2): | Llamadas al sistema (sección 2): | ||
| Línea 293: | Línea 360: | ||
| st_size | st_size | ||
| st_atime | st_atime | ||
| - | st_ctime | + | st_ctime |
| st_mtime | st_mtime | ||
| Línea 303: | Línea 370: | ||
| S_ISREG | S_ISREG | ||
| S_ISFIFO | S_ISFIFO | ||
| + | S_ISLNK | ||
| - | Los atributos se pueden | + | Esta función es usada por el comando ls -l para averiguar las características de un archivo: |
| + | |||
| + | $ ls -l index.html | ||
| + | | ||
| + | |||
| + | La mayoría de estos atributos se pueden | ||
| chmod(path, perms); | chmod(path, perms); | ||
| chown(path, owner, group); | chown(path, owner, group); | ||
| + | utime(path, ...); | ||
| - | También es posible | + | La función utime (ver manual) permite "falsificar" |
| lo usa el comando tar para restaurar la fecha y hora de creación y modificación de los archivos. | lo usa el comando tar para restaurar la fecha y hora de creación y modificación de los archivos. | ||
| - | === Ejemplo: Listar directorios recursivamente === | + | === Ejemplo |
| + | |||
| + | Dada la existencia de los links duros, el nombre de un archivo no basta para identificarlo, | ||
| + | 2 nombres distintos pueden referirse al mismo archivo. | ||
| + | consiste en la identificación de la partición de disco en donde se ubica (campo st_dev) y el inodo | ||
| + | asignado (campo st_ino). Usando estos 2 campos se puede programar un comando que determina | ||
| + | si dos nombres están asociados al mismo archivo. | ||
| + | |||
| + | Ejemplo de uso: | ||
| + | |||
| + | < | ||
| + | % cp a.txt b.txt | ||
| + | % ln a.txt c.txt | ||
| + | % linked a.txt b.txt | ||
| + | not linked | ||
| + | % linked a.txt c.txt | ||
| + | linked | ||
| + | % | ||
| + | </ | ||
| + | |||
| + | Esta es la implementación usando stat: | ||
| + | |||
| + | < | ||
| + | /* linked.c */ | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | |||
| + | int main(int argc, char **argv) { | ||
| + | struct stat st1, st2; | ||
| + | if (stat(argv[1], | ||
| + | fprintf(stderr, | ||
| + | exit(1); | ||
| + | } | ||
| + | if (stat(argv[2], | ||
| + | fprintf(stderr, | ||
| + | exit(1); | ||
| + | } | ||
| + | |||
| + | if (st1.st_dev==st2.st_dev && st1.st_ino==st2.st_ino) | ||
| + | printf(" | ||
| + | else | ||
| + | printf(" | ||
| + | return 0; | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Si 2 nombres de archivos están en directorios de particiones distintas, entonces | ||
| + | no pueden ser el mismo archivo. | ||
| + | en st_dev. | ||
| + | tendrán el mismo valor en st_ino. | ||
| + | |||
| + | === Ejemplo 2: Listar directorios recursivamente === | ||
| #include < | #include < | ||
unix-es.1366906434.txt.gz · Última modificación: por lmateu
