• [^] # Re: man fstat

    Posté par . En réponse au message taille du "fichier" /proc/meminfo. Évalué à 2.

    Je n’avais pas tilté que le fichier était virtuel...

    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <unistd.h>
    #include <fcntl.h>
    #define File "/proc/meminfo"
    int main()
    {
     int fd = open(File,O_RDONLY);
     if (fd == -1)
     {
     fprintf(stderr,"Ouverture de "File" impossible avec open\n");
     }
     else
     {
     struct stat l_stat;
     int rc;
     rc = fstat(fd,&l_stat);
     if (rc == -1)
     {
     perror("fstat error");
     }
     else
     {
     printf("Fichier : "File" : taille : %d\n",l_stat.st_size);
     }
     }
     return 0;
    }
    $ ./a.out
    Fichier : /proc/meminfo : taille : 0
    $ 

    :-(

    La fonction read renvoie le nombre d’octets réellement lus. En définissant un grand buffer ça devrait marcher. En plus, comme Linux n’alloue les pages que quand elles sont utilisées, on peut allouer 1M sans avoir peur.

    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <unistd.h>
    #include <fcntl.h>
    #define File "/proc/meminfo"
    int main()
    {
     int fd = open(File,O_RDONLY);
     if (fd == -1)
     {
     fprintf(stderr,"Ouverture de "File" impossible avec open\n");
     }
     else
     {
     char *l_buffer;
     /* 1M octet est sufisant et pas réellement alloué par linux */
     l_buffer = malloc(1000000);
     ssize_t size;
     size = read(fd,l_buffer,1000000);
     /* size contient la taille réellement lue */
     printf("Fichier : "File" : taille : %d\n",size);
     free(l_buffer);
     }
     return 0;
    }
    $ ./a.out
    Fichier : /proc/meminfo : taille : 1198
    $