Unix文件描述符

今天,我在Linux中发现了非常有趣的文件描述符行为。 看看这个代码:

#include <dirent.h> /* Defines DT_* constants */ #include <fcntl.h> #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/stat.h> #include <sys/syscall.h> #include <sys/types.h> #include <errno.h> #define handle_error(msg) \ do { trace(msg); exit(0); } while (0) #define trace printf int createFile(const char* name) { int r; r = ::open( name, 0 ); if (r < 0) { trace("create file : %s\n", name); r = ::open( name, O_CREAT, 0666 ); if (r < 0) trace("error r < 0 %d\n",errno); } return r; } int createDir(const char* name) { int r = ::mkdir( name, 0777 ); if (r != 0) { trace("error r!=0\n"); } r = open(name, 0); if (r < 0) { trace("error create dir r <0\n"); } return r; } struct linux_dirent { long d_ino; off_t d_off; unsigned short d_reclen; char d_name[]; }; #include <sys/types.h> #include <dirent.h> void test123(int fd) { int nread; char buf[1024]; unsigned char buffer[1024]; struct linux_dirent *d; int bpos,r; char d_type; if (fd == -1) handle_error("open"); for ( ; ; ) { nread = syscall(SYS_getdents, fd, buf, 1024); if (nread == -1) handle_error("getdents"); if (nread == 0) break; trace("--------------- nread=%d ---------------\n", nread); trace("i-node# file type d_reclen d_off d_name\n"); for (bpos = 0; bpos < nread;) { d = (struct linux_dirent *) (buf + bpos); trace("%8ld ", d->d_ino); d_type = *(buf + bpos + d->d_reclen - 1); trace("%4d %10lld %s\n", d->d_reclen, (long long) d->d_off, d->d_name); bpos += d->d_reclen; } } } int main(int argc, const char * argv[]) { int dir = createDir("test"); int file = createFile("test/file.gg"); test123(dir); close(dir); close(file); return 0; } 

在那个代码中我创build文件夹,保存它的文件描述符,在那个文件夹中创build文件,然后我想通过文件描述符打印那个目录中的所有文件。 但是我得到这个输出:

 create file : test/file.gg --------------- nread=32 --------------- i-node# file type d_reclen d_off d_name 48879 16 1 . 48880 16 2 .. 

该文件夹中没有file.gg文件。 所以,我的问题是 – 如何可以和如何正确使用文件描述符? 据我了解文件描述符只是一个本地进程表的索引与所有打开的文件和目录。 但它看起来像文件夹描述符caching文件夹中的某些文件。 如何正确使用描述符在我的情况?

尝试在你的目录上做一个fsync。 你应该用O_RDONLY标志打开目录。 O_WRONLY将会失败。 创建一个文件,同步可能不会同步这个文件的元数据。 本文中的更多信息