【问题标题】:Different signal handlers for parent and child父母和孩子的不同信号处理程序
【发布时间】:2018-03-21 10:35:58
【问题描述】:

我有一个带有信号处理程序的程序:

signal(SIGINT, signalhandler);

然后程序分叉,孩子需要不同的信号处理程序,所以:

pid = fork();

/* What happens here? */

if(pid==0)
{
signal(SIGINT, signalhandler_for_child);
}

那么如果在 fork 之后但在分配新的符号处理程序之前调用 SIGINT 会发生什么?

在孩子获得新的信号处理程序之前,这种情况会发生还是不可能被打断。

如果可能的话。我怎样才能将信号排队给孩子,以便有时间获取新的处理程序?

我知道概率,如果存在的话,肯定几乎是 0,但我想确保应用程序在这方面是健壮的。

【问题讨论】:

  • 在分叉前屏蔽所有信号,然后为两者设置适当的掩码?
  • 是的,我不知道阻塞信号实际上意味着对它们进行排队。我认为阻塞的信号稍后会被丢弃。谢谢。

标签: c signals interrupt


【解决方案1】:

那么,如果在 fork 之后但在分配新的符号处理程序之前调用 SIGINT 会发生什么?

将调用安装在父级中的信号处理程序。子进程继承它。

在孩子获得新的信号处理程序之前,这种情况会发生还是不可能被打断。

肯定会发生。

如果可能的话。我怎样才能将信号排队给孩子,以便有时间获取新的处理程序?

为确保,您需要在调用fork() 之前阻止 SIGINT ,然后为 SIGINT 重新安装不同的 在子进程中,然后解除阻塞 SGINT。

/* block SIGINT here. */

pid = fork();

if (pid == 0) {
    /* Install a new SIGINT handler here. */
    /* Unblock SIGINT. */
    ...
} else if (pid > 0) {
   /* The SIGINT handler is already in place. So just unblock SIGINT. */
   ...
} else {
   /* error */
}

查看sigprocmask()pthread_sigmask() 的阻塞和解除阻塞信号。

您可能还会发现GNU documentation on signal blocking 很有用。

【讨论】:

  • 感谢您的回答。但是,如果我阻止 SIGINT,并且当信号被阻止时出现这些信号之一,则进程(或进程,如果它在 fork 之后)将没有任何行为,他们将不知道他们需要退出。在这种情况下,我需要修改发送信号的进程以多次发送相同的信号,我发现这有点“肮脏”的解决方案。会不会有另一种可能?
  • 任何在被阻止时收到的信号都会在您解除阻止后被传递。这没有什么肮脏的——这是一种“标准”的方式。
  • 谢谢。这是我的问题的关键。我不知道阻塞的信号实际上是排队的。我以为它们只是被阻止然后被丢弃。
猜你喜欢
  • 1970-01-01
  • 2015-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-07
  • 2022-12-16
  • 1970-01-01
相关资源
最近更新 更多