gpt4 book ai didi

c - open() 第一次尝试失败

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

open() 第一次尝试失败并显示 ENOENT(没有这样的文件或目录),但在后续尝试中工作正常。
我的程序派生一个子进程并等待子进程使用 waitpid() 完成。子进程使用 execl() 在特定目录中创建从用户接收的文件路径的副本。
子进程退出后,父进程使用 open() 打开这个新创建的副本。但是,它在第​​一次尝试时以 ENOENT(没有这样的文件或目录)失败。我可以看到子进程在指定目录中创建了一个文件。
如果我通过提供相同的文件名再次运行这个程序,那么它就可以正常工作。我的问题是:为什么它没有在第一次尝试时打开文件?我需要刷新目录还是什么?

我在红帽上

这是一个快速 N 脏代码片段

my_function()
{
char *src = "TEST.txt";
char *dest = "./Output/";
char *fp = "/Output/TEST.txt";
int fd;
struct fstat file_stat;

pid_t PID = fork();

if(PID == -1)
exit(1);


if(PID == 0)
{
execl("/bin/cp", "/bin/cp", src, dest);
exit(1);
}


if(PID > 0)
{
int chldstat;
pid_t ws = waitpid(PID,&chldstat,WNOHANG);
}


if(stat(fp,&file_stat) == -1)
{
perror("stat");
exit(1);
}


if((fd = open(dest,O_RDWR)) == -1)
{
perror("open");
exit(1);
}


if((fp=mmap(0,file_stat.st_size,PROT_READ | PROT_WRITE,fd,0)) == -1)
{
perror("mmap");
exit(1);
}


//OTHER ROUTINES
.............
............
............


}

最佳答案

正如其他人所说,没有源代码很难回答这样的问题。但是:

您似乎患有种族问题。该文件已创建,但比您第一次打开尝试晚了一点。第二次尝试时你比较幸运,文件已经创建。
再次运行正常的事实支持了这个理论——该文件甚至在程序启动之前就已经存在,所以打开它随时都能成功。

你怎么会有竞争条件?如果 child 创建了,父亲在确认 child 结束后才尝试打开,那应该没有问题。
很难推测出了什么问题。也许你等待错误的过程。也许 child 创建了另一个创建文件的进程,而 parent 只等待第一个 child 。还有一百万个可能。

关于c - open() 第一次尝试失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9084658/

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