0

簡単な関数があります。その目的は、ファイルを上書きする前に .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");
        }
    }
}
4

1 に答える 1

2

もちろんwaitpid待っていません。あなたはそうしないように言いました:

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

WNOHANG「待たないで」という意味です。WNOHANG待機する場合は、0 に変更しますwaitpid

于 2014-02-10T22:12:42.703 に答える