我正在尝试练习信号,并试图实现以下目标
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;
}
答案 0 :(得分:1)
为了从父节点向子节点发送信号,首先需要存储子节点的pid(它是成功fork的返回值)。在父代码中,使用getpid()
返回当前正在运行的进程的id,因此返回父进程的id。
尝试类似:
int cid = fork();
if(cid == 0) //child
if(cid > 0){ // parent
//...
kill(cid,...
}