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

标签 c++ file-io filesystems fork-join

所以,我有一个 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。

提前致谢!

最佳答案

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

如果这不起作用,您可能需要循环和/或休眠,直到 parent 可以打开文件,因为您知道它在那里。

关于c++ - Linux 中跨进程的文件 I/O?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4996927/

相关文章:

linux - yocto 上的只读文件系统

c++ - 如何将游戏的 Assets 打包,只允许引擎读取?

python - 如何从 Python 更改符号链接(symbolic link)的 atime 和 mtime?

c++ - 在模板中将 char 转换为 int 引用

c++ - Qt问题: How do signals and slots work?

c++ - 使用 avicap.dll 打开设置

php - 使用带轮询的 PHP 进行网络间文件传输

c# - 有什么方法可以加快在 C# 中打开和散列 15,000 个小文件的速度吗?

c++ - 双向链表中的排序插入

android - ACTION OPEN DOCUMENT TREE 只返回空的 Recent 文件夹