【发布时间】:2018-02-07 21:39:38
【问题描述】:
我正在尝试创建一个程序,其中一个进程分叉,创建一个子进程,并且父进程必须始终在子进程完成屏幕打印之前完成屏幕打印,无论如何。我也希望使用信号而不是流水线来实现这一点。
与此处提出的问题类似:Explanation of sigsuspend needed
我了解kill(pid,signal); 是向该pid 发送信号并告诉它完成执行并终止。
问题是,当它执行时,孩子在暂停后不打印。代码如下:
int main(void){
pid_t pid;
int i;
pid = fork();
if(pid==0){
sigset_t mask;
sigemptyset(&mask);
sigaddset(&mask,SIGUSR1);
printf("This is the child Process id = %d \n",getpid());
sigsuspend(&mask);
printf("The child is now complete \n");
}
else{
printf("This is the parentProcess id = %d \n",getpid());
printf("The parentProcess is complete\n");
sleep(1);
int j = kill(pid,SIGUSR1);
if (j!=0)
{
perror(NULL);
}
exit(0);
}
}
通过使用全局变量int x = 0; 和信号处理方法void handle1(int s){x = 1;}before main,我已经成功地完成了我的任务(在孩子之前打印父母)。主要我添加了signal(SIGUSR1,handle1); 在孩子中我删除了所有的sigset 和sigsuspend 行,而是在printf 语句之前写了while(x==0){/*do_nothing*/} 1 行。因此,当父进程执行kill(pid,SIGUSR1) 时,由子进程继承的信号处理程序也会被执行并设置 x=1。所以孩子现在离开 while 循环并可以打印它的语句。
但是我相信知道如何使用 sigmask_t 和 sigsuspend() 完成这项任务会很有帮助,但我无法让它以这种方式工作。
【问题讨论】:
-
链接问题中接受的答案解释说,sigsuspend 的 {{sigset_t}} 参数指定了您将忽略的那些信号。在设置 SIGUSR1 时,您指示 sigsuspend 阻止它。尝试删除调用 sigaddset 的行,看看会发生什么。
-
是的,仍然不起作用,我忘了提到,在他使用 sigdelset(&mask) 的链接问题中,我也使用了它,但它不起作用。即使我用不同的信号(例如
kill(pid,SIGCONT))调用kill,执行也不会超过sigsuspend(&mask)