Herramientas de usuario

Herramientas del sitio


unix-es

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anteriorRevisión previa
Próxima revisión
Revisión previa
unix-es [2013/05/09 17:00] – [Características de un archivo] lmateuunix-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 nbytesleidos, escritos;+  size_t nbytes
 +  ssize_t leidos, escritos;
   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 <stdio.h>   #include <stdio.h>
-  #include <stdlib.h> +  #include <sys/types.h> 
-  #include <stdarg.h>+  #include <sys/stat.h>
   #include <fcntl.h>   #include <fcntl.h>
 +  #include <stdlib.h>
   #include <unistd.h>   #include <unistd.h>
 +  #include <errno.h>
      
-  void error(char *fmt, ...) { +  #define SIZE 8192
-    va_list args; +
-   +
-    va_start(args, fmt); +
-    fprintf(stderr, "Error: "); +
-    vfprintf(stderr, fmt, args); +
-    fprintf(stderr, "\n"); +
-    va_end(args); +
-   +
-    exit(1); +
-  }+
      
   int main(int argc, char *argv[]) {   int main(int argc, char *argv[]) {
-    int f1f2+    int inout;
     ssize_t n;     ssize_t n;
-    char buf[BUFSIZ]; +    char buf[SIZE]; 
-   +     
-    if (argc!=3) +    if (argc!=3) { 
-      error("Use: my_cp from to"); +      fprintf(stderr, "Use: %s <from> <to>\n", argv[0]); 
-   +      exit(1); 
-    if ((f1= open(argv[1], O_RDONLY))==-1) +    } 
-      error("Can't open %s", argv[1]); +     
-   +    if ((in= open(argv[1], O_RDONLY))==-1) { 
-    if ((f2= creat(argv[2], 0666))==-1) +      perror(argv[1]); 
-      error("Can't open %s", argv[2]); +      exit(2); 
-  +    } 
 +     
 +    if ((out= creat(argv[2], 0666))==-1) { 
 +      perror(argv[2]); 
 +      exit(3); 
 +    } 
 +    
     /* 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))>0) { 
-      if(write(f2, buf, n)!=n) +      if (write(out, buf, n)!=n) { 
-        error("Write error on file %s", argv[2]); +        perror(argv[2]); 
-  +        exit(4); 
 +      } 
 +    } 
 +     
 +    if (n<0) { 
 +      perror(argv[1]); 
 +      exit(5); 
 +    } 
 +     
 +    close(in); 
 +    close(out); 
 +    
     return 0;     return 0;
   }   }
- 
 ==== Cambiar los permisos de un archivo ==== ==== Cambiar los permisos de un archivo ====
  
Línea 228: Línea 237:
   char *path;   char *path;
   unlink(path);   unlink(path);
 +
 +==== Cambiar el nombre de un archivo ====
 +
 +Se usa la funcion //rename//:
 +
 +  #include <stdio.h>
 +  char *oldpath, *newpath;
 +  rename(newpath, oldpath);
  
 ==== Crear un link duro ==== ==== Crear un link duro ====
Línea 246: Línea 263:
 Si se borra datos.txt, el archivo datos2.txt sigue siendo válido. 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.  La única restricción es que //ambos nombres se deben encontrar en directorios
 +de la misma partición de disco//.
  
 ==== Crear un link simbólico ==== ==== Crear un link simbólico ====
  
-Se usa la función //symlink//:+Se usa la función //symlink// para crear un nombre sinónimo de un archivo existente:
  
   #include <unistd.h>   #include <unistd.h>
Línea 255: Línea 275:
   symlink(path, newpath);   symlink(path, newpath);
  
-Se usa para crear un nombre sinónimo de un archivo existente. 
 También se puede crear un link simbólico desde el shell de comandos: También se puede crear un link simbólico desde el shell de comandos:
  
Línea 261: Línea 280:
  
 En este caso datos2.txt es un nombre alternativo para datos.txt. En este caso datos2.txt es un nombre alternativo para datos.txt.
-¡Pero cuidado!  Si se borra datos.txt, datos2 ya no es válido.+¡Pero cuidado!  La desventaja de los links simbólicos (con respecto a los links duros) 
 +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 306: 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);    /* cambia el directorio actual.  Retorna !=0 en caso de error. */
  
 Llamadas al sistema (sección 2): Llamadas al sistema (sección 2):
Línea 335: Línea 360:
   st_size             tamaño del archivo en bytes   st_size             tamaño del archivo en bytes
   st_atime            dia y hora del último acceso   st_atime            dia y hora del último acceso
-  st_ctime            día y hora del último cambio (p.ej. perms)+  st_ctime            día y hora de creación
   st_mtime            día y hora de la última modificación   st_mtime            día y hora de la última modificación
  
Línea 347: Línea 372:
   S_ISLNK             link simbólico?   S_ISLNK             link simbólico?
  
-Los atributos se pueden modificar con las llamadas sistema:+Esta función es usada por el comando ls -l para averiguar las características de un archivo: 
 + 
 +   $ ls -l index.html 
 +   -rw-r--r-- 1 lmateu inv 3851 Aug 16  2007 index.html 
 + 
 +La mayoría de estos atributos se pueden cambiar con llamadas al sistema, como por ejemplo:
  
   chmod(path, perms);   chmod(path, perms);
   chown(path, owner, group);   chown(path, owner, group);
 +  utime(path, ...);
  
-También es posible falsificar el "time stamp" de un archivo, con la función utime (ver manual). Esto+La función utime (ver manual) permite "falsificarel "time stamp" de un archivo. Esto
 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 1: Determinar si 2 nombres de archivos corresponden al mismo archivo === === Ejemplo 1: Determinar si 2 nombres de archivos corresponden al mismo archivo ===
 +
 +Dada la existencia de los links duros, el nombre de un archivo no basta para identificarlo, porque
 +2 nombres distintos pueden referirse al mismo archivo.  La verdadera identidad de un 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.  Llamaremos a este comando linked:
  
 Ejemplo de uso: Ejemplo de uso:
Línea 372: Línea 409:
  
 <code> <code>
 +  /* linked.c */
   #include <stdio.h>   #include <stdio.h>
   #include <sys/stat.h>   #include <sys/stat.h>
unix-es.1368118842.txt.gz · Última modificación: 2013/05/09 17:00 por lmateu