Я начинающий C-программист, пишущий программу, которая берет заданный каталог, взятый из командной строки, а затем печатает сводную информацию о каждом файле / каталоге внутри каталога (код ниже). В нем я объединяю абсолютный путь к текущему каталогу с именами файлов внутри каталога, потому что я хочу расширить программу для обработки более общих случаев. В целом, код, кажется, работает с или без заключительного '/' в каталоге. Например, потребуется:
directory1 / directory2
или
directory1 / directory2 /
Однако он зависает на конкретном файле или, точнее, зависает при следующем вызове readdir () после чтения файла. Всего один файл из всех, что я тестировал. По сути, он будет читать конкретный файл, распечатывать информацию, но затем зависать при следующем вызове readdir (). Это не ошибка или причина неисправности. Он просто останавливается, как будто ждет команды.
Я поэкспериментировал с этим и обнаружил, что для этого конкретного каталога ошибка возникает только тогда, когда я помещаю в каталог последний '/'. Если я не, программа работает нормально. Как уже упоминалось, это не относится к любому другому каталогу, который я тестировал.
Кроме того, я запустил GDB и связал его. Я очень новичок и не знаю, как интерпретировать информацию, которую они предоставляют, но они оба аварийно завершают работу или зависают при вызове следующего readdir (), так же, как и сама программа. Когда GDB зависнет, я могу прервать процесс, и он выдаст что-то вроде этого:
__lll_lock_wait_private ()
at ../sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:95
95 in ../sysdeps/unix/sysv/linux/x86_64/lowlevellock.S
и strace дает это перед тем, как повеситься, а затем рухнуть:
futex(0x5623ad93e294, FUTEX_WAIT_PRIVATE, 2, NULL
Ниже приведен код, который я использую. Любые идеи будут очень полезны.
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <string.h>
struct stat buf;
int main(int argc, char **argv) {
char * r;
strcpy((r = (char *) malloc(strlen(argv[1]) + 1)), argv[1]);
DIR * ptr = opendir(r);
struct dirent * directory = readdir(ptr);
do {
strcat(r, (directory->d_name));
printf("%s\n", r);
stat(r, &buf);
printf("inode number: %ld\n", (directory->d_ino));
printf("offset: %ld\n", (directory->d_off));
printf("name: %s\n", (directory->d_name));
free(r);
r = NULL;
strcpy((r = (char *) malloc(strlen(argv[1]) + 1)), argv[1]);
directory = readdir(ptr);
} while (directory != NULL);
}