gpt4 book ai didi

c++ - Unix 文件描述符

转载 作者:太空狗 更新时间:2023-10-29 21:18:26 26 4
gpt4 key购买 nike

今天我发现 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;
}

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

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 文件。所以,我的问题是 - 它如何以及如何正确使用文件描述符?据我了解,文件描述符只是本地进程表中的一个索引,其中包含所有打开的文件和目录。但看起来文件夹描述符以某种方式缓存了该文件夹中的文件。在我的案例中如何正确使用描述符?

最佳答案

尝试在您的目录上执行 fsync。您应该打开带有 O_RDONLY 标志的目录。 O_WRONLY 会失败。创建文件并同步可能不会同步此文件的元数据。更多信息请参阅 this article

关于c++ - Unix 文件描述符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30220421/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com