从 parent 向 child 和 vice-versa 发送信号

Sending signal from parent to child and vice-versa

我正在尝试练习信号并试图实现以下目标

1) Child 和 parent 打印 10 个数字并将接力棒传递给其他

2) Parent/Child 等待通过 sigsuspend

3) sigaction 只是为了捕捉信号

4) kill 用于发送带有相应进程 ID 的信号

但是输出被 race-conditions 破坏了,我看到一旦 parent 从 child 获得信号,控制永远不会交还给 child

我还希望 sigaction 也能捕捉到信号,但似乎并没有发生。

你能指出我做错了什么吗?

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <signal.h>

static volatile int count = 0;

void sighandler(int sig)
{
    if (sig == SIGUSR1)
    {
        printf(" \n child sends parent signal - \n ");
    }

    if (sig == SIGUSR2)
    {
        printf("\n parent sends child signal - \n ");
    }
}

int main(void)
{
    //pid_t pid, cid;
    sigset_t block_csignal, block_psignal, empty_signal;
    struct sigaction ccatch, pcatch;

    setbuf(stdout, NULL);

    /* Creating signal set for suspending process till
       it receives below signal */
    sigfillset(&block_csignal);
    sigdelset(&block_csignal, SIGUSR2);

    sigfillset(&block_psignal);
    sigdelset(&block_psignal, SIGUSR1);

    /* Creating signal set for catching the signal
       and changing signal disposition */
    sigemptyset(&ccatch.sa_mask);   /* ccatch for catching signal from parent */
    ccatch.sa_flags = 0;
    ccatch.sa_handler = sighandler;

    sigemptyset(&pcatch.sa_mask);  /*  pcatch for catching signal from child */
    pcatch.sa_flags = 0;
    pcatch.sa_handler = sighandler;

    sigaction(SIGUSR2, &ccatch, NULL); /* catch signal from parent for child */
    sigaction(SIGUSR1, &pcatch, NULL); /* catch signal from child for parent */

    switch(fork())
    {
        case -1:
            printf("error in child creation \n ");
            exit(-1);
        case 0:
            printf(" \n Control in hand of child \n ");

            while(count < 50)
            {
                int temp = 0;
                printf(" \n c count ---  \n ");
                while (temp < 10)
                {
                    printf(" %d ", count);
                    temp++;
                    count++;
                }
                printf(" \n parent id in child process --- %d \n ", getppid());
                kill(getppid(), SIGUSR1);  /* send signal to parent */
                sigsuspend(&block_csignal); /* wait till you get signal from parent */

            }
            exit(1);
        default:
            printf("\n Control in hand of parent \n ");
            sigsuspend(&block_psignal); /*wait till you get signal from child*/
            printf("\n Control back in hand of parent \n ");
            while (count < 50)
            {
                int temp = 0;
                printf(" \n p count ---  \n ");
                while (temp < 10)
                {
                    printf(" %d ", count);
                    temp++;
                    count++;
                }
                kill(getpid(), SIGUSR2); /* send signal to child */
            }
            break;
    }

    printf("\n ");
    return EXIT_SUCCESS;
}

为了从父级向子级发送信号,您首先需要存储子级的 pid(它是来自成功分叉的 return 值)。在父代码中,您使用 getpid(),其中 return 是当前 运行 进程的 ID,因此是父进程。

试试这样的东西:

  int cid = fork();
  if(cid == 0) //child
  if(cid > 0){ // parent
    //... 
    kill(cid,... 
}