[英]Why doesn't this C code for listing a directory work?
我認為以下C代碼將列出根目錄中的內容。 為什么會永遠循環?
#define _GNU_SOURCE
#define _POSIX_C_SOURCE 200809L
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/syscall.h>
#include <stddef.h>
#include <stdlib.h>
#include <stdio.h>
typedef struct linux_dirent {
unsigned long d_ino;
unsigned long d_off;
unsigned short d_reclen;
char d_name[];
} linux_dirent;
extern int getdents(unsigned int fd, struct linux_dirent *dirp, unsigned int count)
{
return syscall(SYS_getdents, fd, dirp, count);
}
int main(void)
{
linux_dirent* entryPtr = malloc(20000000);
linux_dirent* buffer = entryPtr;
int fd = open("/", O_RDONLY | O_DIRECTORY);
int numentries = getdents((unsigned int)fd, entryPtr, 20000000);
close(fd);
for(;(entryPtr - buffer) < numentries; entryPtr += entryPtr->d_reclen)
{
puts(entryPtr->d_name);
}
}
(entryPtr-緩沖區)將返回(指針之間的差異)/(sizeof(linux_dirent)),而numentries以字節為單位。 如果您要使用char ptr並將其轉換為entry_ptr,則可能會起作用-即
int main(void)
{
char *entryPtr = malloc(20000000);
char* buffer = entryPtr;
int fd = open("/", O_RDONLY | O_DIRECTORY);
int numentries = getdents((unsigned int)fd, (linux_dirent *)entryPtr, 20000000);
close(fd);
for(;(entryPtr - buffer) < numentries; entryPtr += ((linux_dirent *)entryPtr)->d_reclen)
{
puts(((linux_dirent *)entryPtr)->d_name);
}
}
它可能會工作。 但是,我同意您應該使用readdir,而不是getdents。
它應該是
for(;
(entryPtr - buffer) < numentries;
entryPtr = (char*)((entryPtr+1)+entryPtr->d_reclen+2)
)
{
puts(entryPtr->d_name);
}
+2用於填充字節和d_type
字段
因為根據getdents(2) ,條目的長度是可變的。
但是您真的想使用readdir(3) 。 getdents
是只對那些執行有用readdir
,像readdir.c從MUSL的libc 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.