跨Linux进程的文件I / O?

所以,我有一个Linux进程,我正在尝试管理磁带上的一些文件。我有以下代码尝试从磁带上的当前存档中提取文件catalog.xml,并将其复制到固定位置(最终,我将解析文件并对结果进行一些处理)。但是,我的代码间歇性地无法正常工作。 tar命令总是成功,(如果我检查文件系统,我会看到catalog.xml文件),但有时我的后续检查以查看文件是否存在返回false。我做错了什么吗?看起来我可能遇到fork()ed进程返回之间的竞争条件,并且该进程的结果在文件系统上可见 - 我需要进行一些调用吗?
  pid_t tPid = vfork();
  if (0 == tPid)
  {
    int tChildRet;
    tChildRet = execlp("tar", "tar", "-xvf", "/dev/nst0", "-C", "/tmp", "catalog.xml", (char *) 0);
    _exit(-1 == tChildRet ? EXIT_FAILURE : EXIT_SUCCESS);
  }
  else
  {
    wait(&ret);
  }
std::ifstream tCatalogFile("/tmp/catalog.xml");
if (tCatalogFile)
{
   cout << "File exists!" << endl;
} else {
   cout << "File does not exist!" << endl;
}
我得到“文件存在!”或者“文件不存在!”,看似随意。 其他说明: 关于失败案例: 如果我做了
stat ("/tmp/catalog.xml")
,我得到-1的返回值,并将errno设置为ENOENT。 tar命令(使用-v标志运行)产生预期的一行输出(“catalog.xml”) / tmp是本地tmpfs文件系统;磁带机是本地设备。 我在x86_64盒子上使用2.6.30.9 Linux内核和g ++ 4.1.2。 提前致谢!     
已邀请:
如果
execlp
成功,它将永远不会到达你叫
_exit
的行。您没有从
wait
检查返回值(
ret
)。目前尚不清楚为什么你应该使用
vfork
。等等。 由于父母在等待孩子完成之外没有做任何其他事情,为什么不让你的生活更轻松,只需使用
system()
?     
在父母的
wait
电话后尝试拨打
sync
。 如果这不起作用,您可能需要循环和/或睡眠,直到父级可以打开文件,因为您知道它在那里。     

要回复问题请先登录注册