0

C/C++ 上の Unix で 3 つの異なるプロセスをシグナルと同期するにはどうすればよいですか? 私が必要です:最初のプロセスが2番目のプロセスを開始します。2 番目のプロセスが 3 番目のプロセスを開始します。3 番目のプロセスが開始された後、すべてのプロセスを 1 - 2 - 3 の順に強制終了します。

これに待機、シグナル、一時停止などの機能を使用することについてはわかりません。私たちを手伝ってくれますか?ありがとう。

#include <iostream>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>

using namespace std;

int main (int argc, char * const argv[]) {

    pid_t three_pid;
    pid_t second_pid;
    pid_t first_pid;

    cout << "child 1 is started" << endl;

    pid_t pid;

    if ((pid = fork()) == -1)
    {
        cout << "fork errror" << endl;
        exit(EXIT_FAILURE);
    }
    else if (pid == 0)
    {
        second_pid = getpid();

        cout << "child 2 is started" << endl;

        pid_t pid2;

        if ((pid2 = fork()) == -1)
        {
            cout << "fork 2 error" << endl;
            exit(EXIT_FAILURE);
        }
        else if (pid2 == 0)
        {
            three_pid = getpid();
            cout << "child 3 is started" << endl;

            cout << "child 3 is TERMINATED" << endl;
        }
        else
        {
            cout << "child 2 is TERMINATED" << endl;
        }
    }
    else
    {
        first_pid = getpid();

        cout << "child 1 is TERMINATED" << endl;
    }
}
4

2 に答える 2

3

移植可能な方法でこれを行うには、プロセス 3 (孫) を呼び出しkill(<pid1>, SIGKILL)kill(<pid1>, 0)、プロセスがまだ実行されているかどうかをテストします。それがなくなった場合、 set tokill()で失敗します。errnoESRCH

次に、プロセス 3 で に対して同じことを行い<pid2>ます。

次に、プロセス 3 を終了させます。

于 2012-10-27T07:51:12.887 に答える
2

waitpid子プロセスが終了するまで待機するには、親プロセスで使用する必要があります。詳細については、 http://linux.die.net/man/2/waitpidを参照してください。このような:

int status;
if (waitpid(cpid, &status, 0) < 0) { // where cpid is child process id
    perror("waitpid");
    exit(EXIT_FAILURE);
}

また、を使用して子プロセスを正しく終了する必要があります_exit(exitCode)。詳細については、 http://linux.die.net/man/2/exitを参照してください。

編集:プロセスを 1-2-3 の順序で終了する場合は、子プロセスで親プロセス ID を待ちます。

于 2012-10-27T07:36:27.293 に答える