1

我有以下源代码,我正在从父母向孩子发送信号:

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

问候,丹尼斯。

4

1 回答 1

1

您发送信号的速度如此之快,以至于信号处理程序处理SIGUSR1被下一个信号中断并在它返回之前首先处理它。

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

要么向你的父母发送某种形式或确认,让你的父母睡一会儿或让你的信号处理程序更快地返回(将信号到达存储在缓冲区中。调用printf是一个相当长的调用。

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

于 2012-11-20T16:36:52.193 回答