Перечисление файлов каталога с помощью системных вызовов open() и read() в системах POSIX

#c #linux #operating-system #system #systems-programming

Вопрос:

Мне было интересно, как это сделать. Я перепробовал несколько вещей, но, похоже, у меня ничего не получается. Я не хочу использовать системный вызов opendir() и не хочу использовать системный вызов readdir (). Не могли бы вы, пожалуйста, сказать мне, как это сделать, потому что я получаю мусорные значения. Я хочу перечислить файлы, которые находятся внутри папки. Я получаю значение мусора, хранящееся в буфере из этого кода.

 char buffer[16];
    size_t offset = 0;
    size_t bytes_read;
    
    int i;
    /* Open the file for reading. */
    int fd = open ("testfolder", O_RDONLY);
    /* Read from the file, one chunk at a time. Continue until read
    “comes up short”, that is, reads less than we asked for.
    This indicates that we’ve hit the end of the file. */
    do {
        /* Read the next line’s worth of bytes. */
        bytes_read = read (fd, buffer, 16);
        /* Print the offset in the file, followed by the bytes themselves.*/
        
        // printf ("0xlx : ", offset);
        // for (i = 0; i < bytes_read;   i)
        // printf ("x ", buffer[i]);
        printf("%s", buffer);
        printf ("n");
        /* Keep count of our position in the file. */
        // offset  = bytes_read;
    }
    while (bytes_read!=-1);
 

Ответ №1:

Ты не можешь этого сделать. Ядро разрешает доступ только open к каталогу со специальными опциями, и оно вообще не разрешает read доступ к каталогу. Вы должны использовать opendir и readdir .

(Под капотом opendir звонит open с теми специальными опциями, о которых я упоминал, и readdir вызывает частный системный вызов getdents . Видишь https://sourceware.org/git/?p=glibc.git;a=большой двоичный объект;f=sysdeps/unix/sysv/linux/opendir.c и https://sourceware.org/git/?p=glibc.git;a=большой двоичный объект;f=sysdeps/unix/sysv/linux/readdir.c . Делать это самостоятельно не рекомендуется.)