从 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,...
}
我正在尝试练习信号并试图实现以下目标
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,...
}