我有以下源代码,我将信号从父母发送给孩子:
sigset_t sig_m1, sig_m2, sig_null;
int signal_flag=0;
void start_signalset();
void sig_func(int signr) {
printf("%d\n", signr, n);
start_signalset();
}
void start_signalset() {
if(signal(SIGUSR2, sig_func) == SIG_ERR) {
exit(0);
}
if(signal(SIGUSR1, sig_func) == SIG_ERR) {
exit(0);
}
}
void wait_for_parents() {
while(signal_flag == 0) {
sigsuspend(&sig_null);
}
}
int main(){
int result,pt_pid;
start_signalset();
pt_pid=getpid();
result = fork();
if(result==-1){
printf("Can't fork child\n");
exit(-1);
} else if (result == 0) {
wait_for_parents();
} else {
kill(result,SIGUSR2);
kill(result,SIGUSR2);
kill(result,SIGUSR1);
kill(result,SIGUSR2);
signal_flag = 1;
}
return 0;
}
我看到了:31,31,31,30,但我期待看到31,31,30,31。我哪里有错误?我认为同步存在一些问题。但是,我不明白如何解决它,我不确定问题是否存在。
问候,丹尼斯。
答案 0 :(得分:1)
您发送信号的速度非常快,信号处理程序处理SIGUSR1
会被下一个信号中断并在返回之前先处理。
SIGUSR1
的信号处理程序后继续执行并打印。向父母发送一些排序或确认,让你的父母睡一会儿或让你的信号处理程序返回更快(存储信号到达缓冲区。调用printf
是一个很长的电话。
当进程的信号到达时,该进程的随机线程被中断并开始执行信号处理程序。如果信号处理程序返回该线程将继续像往常一样执行。信号处理程序也可以中断!