如何解决如何使用信号在进程之间进行同步?
目标是父进程应该让子进程成为一个,父进程打印 1 到 100 之间的偶数,子进程打印奇数。这种机制应该使用信号来实现(数字应该是按顺序排列的,例如 parent:0、child:1、parent:2...)我做了以下代码:
#include<stdlib.h>
#include<stdio.h>
#include<unistd.h>
#include<signal.h>
#include<sys/wait.h>
int main(){
pid_t pid;
pid = fork();
if (pid == -1){
return 1;
}
if (pid == 0){
for(int i=0; i<=100; i++){
if (i % 2 != 0){
printf("I am the child: %d\n",i);
}
}
} else {
kill(pid,SIGSTOP);
for(int i=0; i<=100; i++){
if(i % 2 == 0){
printf("I am the parent: %d\n",i);
kill(pid,SIGCONT);
}
}
wait(NULL);
}
return 0;
}
但是输出的顺序不是它应该的顺序,父母先打印他的所有数字,孩子跟着他。我想知道 SIGSTOP 和 SIGCONT 是否不是适合使用的信号,但没有其他合乎逻辑的解决方案。
任何建议都会有所帮助。谢谢。
解决方法
阻止信号并仅在接收到该信号时恢复。关于使用哪个信号,您可以使用任何可以被阻止的信号(不包括 SIGKILL
、SIGSTOP
的任何信号)。我使用 SIGRTMIN
是因为它用于应用程序定义的目的。
#include<stdlib.h>
#include<stdio.h>
#include<unistd.h>
#include<signal.h>
#include<sys/wait.h>
int main(){
/* Block SIGRTMIN */
sigset_t sigmask;
sigemptyset(&sigmask);
sigaddset(&sigmask,SIGRTMIN);
if (sigprocmask(SIG_BLOCK,&sigmask,NULL) != 0)
exit(1);
int signo;
/* Spawn a new child */
pid_t pid;
pid = fork();
if (pid == -1){
return 1;
}
if (pid == 0){
sigwait(&sigmask,&signo); // This is to make parent start first.
for(int i=1; i<=100; i=i+2){
printf("I am the child: %d\n",i);
kill(getppid(),SIGRTMIN); // Resume parent
sigwait(&sigmask,&signo); // Wait for parent
}
} else {
for(int i=0; i<=100; i=i+2){
printf("I am the parent: %d\n",i);
kill(pid,SIGRTMIN); // Resume child
if (i == 100) // Parent stucks at sigwait after printing 100.
break;
sigwait(&sigmask,&signo); // Wait for child
}
wait(NULL);
}
return 0;
}
我们在父级中阻止了 SIGRTMIN,但它是如何在子级中被阻止的?
根据 signal(7)
手册页。
通过 fork(2) 创建的子级继承了其父级的副本 信号掩码;信号掩码在 execve(2) 中保留。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。