waitpid似乎没有进食

时间:2014-02-10 22:04:02

标签: c++ linux process cp waitpid

我有一个简单的功能 - 它的目的是在覆盖之前将文件复制到.old。因为我很懒(这里有一个答案建议)我分叉并使用cp来完成这项工作。

然后我调用waitpid并检查返回码。

调用它的代码调用我的复制功能,然后立即打开文件进行读取。不知何故,调用代码似乎在cp调用之前运行 - 新文件被复制。 最好的例子是文件和备份都不存在。两者都被创建并包含我的保存调用输出。

我正在努力想知道自己哪里出错了,我们将不胜感激。

copy_old();
std::ofstream savefile (SETTINGS_LOCATION);
if (savefile.is_open())
{
    savefile << ...


void settings::copy_old()
{
    int childExitStatus;
    pid_t pid;

    pid = fork();

    if (pid == 0) { /* child */
        execl("/bin/cp", "/bin/cp", "-f", SETTINGS_LOCATION, SETTINGS_LOCATION_B, (char *)0);
    }
    else if (pid < 0) {
        ERR("Could not Backup Previous Settings");
    }
    else {
        pid_t ws = waitpid( pid, &childExitStatus, WNOHANG);
        if (ws == -1)
        {
            ERR("Could not Backup Previous Settings1");
        }

        if( !WIFEXITED(childExitStatus) || WEXITSTATUS(childExitStatus)) /* exit code in childExitStatus */
        {
            ERR("Settings backup may have been unsuccessful");
        }
    }
}

1 个答案:

答案 0 :(得分:2)

当然waitpid没有等待。你告诉它不要:

pid_t ws = waitpid( pid, &childExitStatus, WNOHANG);

WNOHANG表示“不要等待”。如果您希望WNOHANG等待,请将waitpid更改为0.