0

如何在 C/C++ 上的 Unix 中将 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)来测试进程是否仍在运行。如果它的消失kill()将失败并errno设置为ESRCH

然后让进程 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 回答