【发布时间】:2015-04-22 03:12:31
【问题描述】:
我的 C++ 程序通过 system() 调用另一个程序。该程序写入文件。我不能修改被调用的程序。
然后我的程序需要读入写入的文件。目前,我的程序读入文件太快了,以至于其他程序的更改还没有影响到文件系统,我的程序读入了一个过时的版本。
如何强制被调用程序在我的程序尝试读取之前完成写入?或者调用程序如何检查文件是否已完成写入?
我从 fork/execv 和 CreateProcess 切换到 system(),这样程序就会阻塞,我不必等待终止。所以,如果有帮助,我可以切换回去。
现在,我唯一的想法是在调用 system() 之前删除该文件——这样除非写入完成,否则它不会存在。
任何解决方案都需要有适用于 Mac、Windows 和 Linux 的版本。
【问题讨论】:
-
不要使用
system()。这是邪恶的。 -
您的 system() 是否直接调用您的程序?程序是否在同一个进程中完成它的任务(相对于产生一个分离的进程等)? system() 阻塞直到子进程退出;它所做的任何文件更新都应该对父级可见。
-
我的 system() 调用确实直接调用了该程序——该程序没有做任何花哨的事情。只是一个编写简单文本文件并退出的进程。我同意任何更改都应该是可见的——这就是我使用 system() 的原因——但它不起作用。如果我稍等片刻然后打开它,我就会得到想要的行为。
-
Qix,很抱歉您认为标准 API 调用可能是邪恶的。从系统切换到 fork/exec 和 CreateProcess 是一种选择,但它不能解决这个问题。我有一个 wait() 循环来监视进程是否完成,然后读取文件。它有时有效,但有时无效。