如何从父母发送信号SIGUSR1和SIGUSR2给孩子?

时间:2012-11-20 16:33:09

标签: c unix signals freebsd

我有以下源代码,我将信号从父母发送给孩子:

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。我哪里有错误?我认为同步存在一些问题。但是,我不明白如何解决它,我不确定问题是否存在。

问候,丹尼斯。

1 个答案:

答案 0 :(得分:1)

您发送信号的速度非常快,信号处理程序处理SIGUSR1会被下一个信号中断并在返回之前先处理。

  • 信号2到达,打印
  • 信号2到达,打印
  • 信号1到达,在打印之前被中断,因为另一个信号2到达
  • 信号2到达,打印
  • 在最后一个信号处理程序返回SIGUSR1的信号处理程序后继续执行并打印。

向父母发送一些排序或确认,让你的父母睡一会儿或让你的信号处理程序返回更快(存储信号到达缓冲区。调用printf是一个很长的电话。

当进程的信号到达时,该进程的随机线程被中断并开始执行信号处理程序。如果信号处理程序返回该线程将继续像往常一样执行。信号处理程序也可以中断!