Preguntilla de C

Buenas, acabo de entregar una práctica de redes que consistía en ejecutar un programa en un ordenador de forma remota, y para ello he tenido que ir pasando los datos vía red. El problema que me surgió, fue que pretendía averiguar el tamaño del archivo mediante una llamada a du desde system, una cosa así:
system("du prueba"); el caso es que la funcion du devuelve 0 si todo va bien y != 0 si hay algún error. He tenido que hacerlo leyendo en bloques, pero aún me corroe la duda ¿hay alguna manera de hacer algo parecido al du?

Muchas gracias.

Un saludo.
Para saber el tamaño de un fichero se puede usar la llamada al sistema lseek. E aqui un ejemplo:

TamFitxero=lseek(f,0,L_XTND);

La varialble f es el file descriptor del fichero del qual quieres saber el tamaño.
La funcion en realidad, lo que hace es jugar con el apuntador que apunta a la posicion actual dentro del fichero en cuestion. Esta funcion con la constante L_XTND lo que hace es mover ese apuntador hasta la posicion final mas 0, y luego esta te devuelve la posicion, de esta manera conoces su tamaño.
Si quieres mover el puntero al inicio del fichero haz:

lseek(f,0,L_SET);

No se si me habré del explicado del todo bien. Tu diras

Espero que te sirva

Salu2

[OT] PD: Por cierto yo también hice esta practica el año pasado. No se como os la han hecho hacer vosotros, pero nosotros nos la hicieron hacer con una estructura por tres capas, y el protocolo funcionando sobre udp, menudo caos, esa practica ha sido una de la practicas de programacion en la que he necesitado mas horas.
Cafetino escribió:Para saber el tamaño de un fichero se puede usar la llamada al sistema lseek. E aqui un ejemplo:

TamFitxero=lseek(f,0,L_XTND);

La varialble f es el file descriptor del fichero del qual quieres saber el tamaño.
La funcion en realidad, lo que hace es jugar con el apuntador que apunta a la posicion actual dentro del fichero en cuestion. Esta funcion con la constante L_XTND lo que hace es mover ese apuntador hasta la posicion final mas 0, y luego esta te devuelve la posicion, de esta manera conoces su tamaño.
Si quieres mover el puntero al inicio del fichero haz:

lseek(f,0,L_SET);

No se si me habré del explicado del todo bien. Tu diras

Espero que te sirva

Salu2

[OT] PD: Por cierto yo también hice esta practica el año pasado. No se como os la han hecho hacer vosotros, pero nosotros nos la hicieron hacer con una estructura por tres capas, y el protocolo funcionando sobre udp, menudo caos, esa practica ha sido una de la practicas de programacion en la que he necesitado mas horas.


Gracias por la info ;), ya trastearé con ese comando ;).

A nosotros también nos lo han hecho hacer en 3 capas, por ahora hemos implementado 2, no creo que toquemos UDP aún porque la asignatura se subdivide en 2 redes 1 y 2 ;), por ahora solo tramas sobre Ethernet, no muy complicado. Un saludo.
¿?

struct stat {
         dev_t    st_dev;    /* device inode resides on */
         ino_t    st_ino;    /* inode's number */
         mode_t   st_mode;   /* inode protection mode */
         nlink_t  st_nlink;  /* number or hard links to the file */
         uid_t    st_uid;    /* user-id of owner */
         gid_t    st_gid;    /* group-id of owner */
         dev_t    st_rdev;   /* device type, for special file inode */
         struct timespec st_atimespec;  /* time of last access */
         struct timespec st_mtimespec;  /* time of last data modification */
         struct timespec st_ctimespec;  /* time of last file status change */
         off_t    st_size;   /* file size, in bytes */
         quad_t   st_blocks; /* blocks allocated for file */
         u_long   st_blksize;/* optimal file sys I/O ops blocksize */
         u_long   st_flags;  /* user defined flags for file */
         u_long   st_gen;    /* file generation number */
     };


man stat


Salu2.Ferdy
Ferdy escribió:¿?

struct stat {
         dev_t    st_dev;    /* device inode resides on */
         ino_t    st_ino;    /* inode's number */
         mode_t   st_mode;   /* inode protection mode */
         nlink_t  st_nlink;  /* number or hard links to the file */
         uid_t    st_uid;    /* user-id of owner */
         gid_t    st_gid;    /* group-id of owner */
         dev_t    st_rdev;   /* device type, for special file inode */
         struct timespec st_atimespec;  /* time of last access */
         struct timespec st_mtimespec;  /* time of last data modification */
         struct timespec st_ctimespec;  /* time of last file status change */
         off_t    st_size;   /* file size, in bytes */
         quad_t   st_blocks; /* blocks allocated for file */
         u_long   st_blksize;/* optimal file sys I/O ops blocksize */
         u_long   st_flags;  /* user defined flags for file */
         u_long   st_gen;    /* file generation number */
     };


man stat



Mu buena esa. No conocia esa función, y yo montandome pirulas con lseek [ayay]
Me la apunto para las proximas practicas :p

Salu2
Ferdy escribió:¿?

struct stat {
         dev_t    st_dev;    /* device inode resides on */
         ino_t    st_ino;    /* inode's number */
         mode_t   st_mode;   /* inode protection mode */
         nlink_t  st_nlink;  /* number or hard links to the file */
         uid_t    st_uid;    /* user-id of owner */
         gid_t    st_gid;    /* group-id of owner */
         dev_t    st_rdev;   /* device type, for special file inode */
         struct timespec st_atimespec;  /* time of last access */
         struct timespec st_mtimespec;  /* time of last data modification */
         struct timespec st_ctimespec;  /* time of last file status change */
         off_t    st_size;   /* file size, in bytes */
         quad_t   st_blocks; /* blocks allocated for file */
         u_long   st_blksize;/* optimal file sys I/O ops blocksize */
         u_long   st_flags;  /* user defined flags for file */
         u_long   st_gen;    /* file generation number */
     };


man stat


Salu2.Ferdy


Gracias.

Un saludo.
5 respuestas