open()
在首次尝试时无法使用ENOENT(没有此类文件或目录),但在后续尝试中可以正常工作。
我的程序分叉子进程并等待孩子使用waitpid()
完成。子进程使用execl()
创建从特定目录中的用户接收的文件路径的副本
子进程退出后,父进程将使用open()
打开此新创建的副本。但是在第一次尝试时它与ENOENT(没有这样的文件或目录)失败。我可以看到子进程在指定的目录中创建了一个文件
如果我通过提供相同的文件名再次运行该程序,那么它工作正常。我的问题是:为什么不在第一次尝试时打开文件?我需要刷新目录还是什么?
我在redhat上
这是一个快速的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
.............
............
............
}
答案 0 :(得分:3)
正如其他人所指出的,如果没有源代码,很难回答这样的问题。但是:
你似乎患有竞争条件。该文件已创建,但比您的第一次打开尝试晚了一点。在你的第二次尝试中,你更幸运,文件已经创建 再次运行工作正常的事实支持这一理论 - 该文件甚至在程序启动之前就存在,因此随时打开它成功。
你怎么会有竞争条件?如果孩子创造了它,并且父亲只有在确认孩子已经结束后才试图打开它,那么应该没有问题。
很难推测出了什么问题。也许你等待错误的过程。也许孩子创建了另一个创建文件的进程,而父进程只等待第一个子进程。还有一百万其他的maybes。
答案 1 :(得分:1)
您正在使用WNOHANG
标志调用waitpid()
,这意味着如果该子项仍在运行,它将不会实际阻止等待该子项。该标志用于测试子进程状态是否已更改,如果没有则实际等待;返回值将指示孩子是否准备好了。如果您希望它阻止等待它,请删除WNOHANG
标志。但是,请注意,如果调用被信号处理程序中断,它仍然可以在子状态更改之前返回。如果您不关心孩子是否成功退出,那么您可以写下:
while (waitpid(PID, &chldstat, 0) == -1 && errno == EINTR)
;