【问题标题】:How to send signal SIGUSR1 and SIGUSR2 from parent to children?如何将信号 SIGUSR1 和 SIGUSR2 从父母发送给孩子?
【发布时间】:2012-11-20 16:33:08
【问题描述】:

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

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

问候,丹尼斯。

【问题讨论】:

    标签: c unix signals freebsd


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 感谢您的回复!我认为如果我添加一个缓冲区,它会解决我的问题吗?例如,我将创建一个全局数组 ARR,我将这样做:ARR[i] = signr in function sig_func?我的主要目标是获取孩子体内所有传输的信号。
    • 它会显着减少竞争条件的机会,但不会消除这种可能性。使其与信号 100% 同步的唯一方法是让父级等待确认。除非您已设置好信号,否则我建议您使用管道进行此类通信。
    • 感谢您的建议。我会试试看。
    猜你喜欢
    • 1970-01-01
    • 2015-09-14
    • 1970-01-01
    • 1970-01-01
    • 2022-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-28
    相关资源
    最近更新 更多