孩子和父母之间使用信号进行双向通讯

时间:2019-10-10 21:55:57

标签: c linux signals ipc

我是Linux和IPC的新手,所以请多多包涵。 我陷入了一个家庭作业问题,需要创建双向通讯系统,即:

1. Parent sends SIGUSR1 to multiple (1 to 10) children
2. Children all respond with SIGUSR2 to parent
3. If all SIGUSR2 signals are collected, parent pauses for 1 second
4. Repeat from [1], until SIGTERM is sent to parent

目前,我正试图仅让一个孩子使用它,我需要使用Parent ..和ChildHandler函数来处理获取的信号。

我尝试将初始SIGUSR1发送给子级,然后使用ChildHandler将其 kill(getppid(),SIGUSR)发送给父级,但这并没有达到我的预期。在父级开始等待之前,ChildHandler似乎没有收到信号。

ParentHandler(int signo)

    if (signo == SIGUSR2)
    {
        printf("P received SIGUSR2\n");

        printf("Waiting for %d sec...\n\n", WAIT_TIME);
        sleep(WAIT_TIME);
        return;
    }
    else
    {
        printf("Something went wrong in PH...\n\n");
        exit(1);
    }

ChildHandler(int signo)

    if (signo == SIGUSR1)
        printf("C received SIGUSR1\n");

    kill(getppid(), SIGUSR2); // P <--SIGUSR2--- C

    return;

主要

    pid_t pid, ppid;
    ppid = getpid();

    // Subscribe parent to SIGTERM
    // signal(SIGTERM, SigTermParentHandler);

    // Parent <--> Child dialogue
    if ((pid = fork()) != 0) // Parent
    {
        printf("P: %d | C: %d\n\n", ppid, pid);

        if (signal(SIGUSR2, ParentHandler) == SIG_ERR)
            printf("SIGUSR2 to parent was interrupted!");

        while (1)
        {
            printf("P ---SIGUSR1--> C\n");
            kill(pid, SIGUSR1); // P ---SIGUSR1--> C
        }
    }
    else // Child
    {
        sleep(WAIT_TIME); // Wait for parent to finish setting up

        if (signal(SIGUSR1, ChildHandler) == SIG_ERR)
            printf("SIGUSR1 to child was interrupted!");
    }

我希望输出接近以下内容:

Parent PID is: 13918
P: 13918 | C: 13919

P ---SIGUSR1--> C
C received SIGUSR1
P <--SIGUSR2--- C
P received SIGUSR2
Waiting for 1 sec...

P ---SIGUSR1--> C
...

1 个答案:

答案 0 :(得分:0)

我认为这里发生的是孩子在等待时收到信号。 将“ signal(SIGUSR1,ChildHandler)”放在睡眠调用上方应该可以解决此问题。