从父母发送信号到孩子,反之亦然

时间:2016-01-23 22:42:58

标签: c process signals ipc

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

1)儿童和父母打印10个数字并将接力棒传递给其他

2)家长/孩子等待转过sigsuspend

3)sigaction只是为了抓住信号

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

然而,输出受到竞争条件的影响,我看到一旦父母从子女控制中得到信号,就永远不会交给孩子

此外,我还希望能够抓住信号,这似乎也不会发生。

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

#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;
}

1 个答案:

答案 0 :(得分:1)

为了从父节点向子节点发送信号,首先需要存储子节点的pid(它是成功fork的返回值)。在父代码中,使用getpid()返回当前正在运行的进程的id,因此返回父进程的id。

尝试类似:

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