【发布时间】:2012-01-23 21:09:16
【问题描述】:
我正在尝试从我的程序创建一个 TAR 存档,然后打开存档以进行进一步处理。我在调用 system() 和 open() 之间有 2 秒的延迟。到目前为止,它工作正常,但我不确定为什么需要 2 秒延迟或者它是否是正确的解决方案。
没有延迟,我从open() 调用中得到错误代码2(ENOENT“没有这样的文件或目录”)。我的第一个想法是文件系统更新速度不够快,open() 找不到文件。但是如果系统真的很忙呢?我需要更长的延迟吗?我应该循环直到open() 成功而不是延迟?问题是完全不同的吗?
更新
根文件系统是 EXT2。 /tmp 使用 TMPFS 安装在 RAM 中。我正在使用tar创建一个存档,而不是提取其中的内容。本质上,我的程序应该创建一些日志文件的存档并通过网络发送它们(这就是我在创建存档后打开存档的原因)。
int return_value = system("/bin/tar -czf /tmp/logs.tar.gz /var/log/mylogs.log* &> /dev/null");
// error checks on return_value as described here: http://linux.die.net/man/2/wait
if(return_value != 0) {
return return_value;
}
//usleep(2000000);
return_value = open("/tmp/logs.tar.gz", O_RDONLY | O_LARGEFILE, 0);
// success or failure depending on whether there's a delay or not
【问题讨论】:
-
如果你使用
popen会发生什么? -
没错,这是
popen()的工作。教system()的教程应该被砍了。 -
popen()与system()具有相同的最终结果。 IE。open()调用以同样的方式失败,没有延迟。 -
我们在这里讨论的是什么文件系统?是否涉及网络传输?您可能是蹩脚的消费级 NAS 设备的受害者吗? (去过那里,看到...例如,NAS 开发人员使用 CIFS 导出其文件 - 并且从不存储文件戳,这意味着 rsync 无法正常工作。)
-
也许问题出在其他地方。您应该展示实际代码以获得真正的帮助。
标签: c linux file race-condition ext2