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/05/02 16:39] – [Lectura/escritura de archivos] 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 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.1367512752.txt.gz · Última modificación: 2013/05/02 16:39 por lmateu