【发布时间】:2012-02-23 11:22:44
【问题描述】:
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
.............
............
............
}
【问题讨论】:
-
你能发布一些你的代码吗?
-
您需要显示代码,尤其是。创建/等待子进程。听起来你等待孩子完成的方式有些古怪。