繁体   English   中英

Linux中跨进程的文件I / O?

[英]File I/O across processes in Linux?

因此,我有一个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机器上使用带有g ++ 4.1.2的2.6.30.9 Linux内核。

提前致谢!

尝试在父级的wait调用之后调用sync

如果这样不起作用,则可能需要循环和/或睡眠,直到父级可以打开文件为止,因为您知道该文件已经存在。

如果execlp成功,它将永远不会到达您调用_exit的行。 您没有在wait检查返回值( ret )。 目前尚不清楚为什么应该使用vfork 等等。

由于父母除了等待孩子完成工作外没有做其他事情,为什么不让生活变得更轻松,而只使用system()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM