【问题标题】:C - How to correctly use SIGUSR1?C - 如何正确使用 SIGUSR1?
【发布时间】:2018-05-21 10:08:49
【问题描述】:

我在 Google 上进行了广泛搜索,但没有找到关于如何使用用户定义信号 (SIGUSR1/SIGUSR2) 的明确说明。

上下文:我试图在正在运行的进程中发送一个信号,这样一旦发送了信号,信号处理程序就会打印一条语句来告诉用户信号已被捕获。我尝试使用如下所示的信号处理程序。

void signalHandler(int signalNum) {
  if (signalNum == SIGUSR1) {
    printf("Caught SIGUSR1 signal.\n");
  }
}

/* Call in main as follows */
signal(SIGUSR1, signalHandler);

现在据我了解,可以通过使用我尝试过的 raise() 函数在进程中发出信号(我正在尝试执行以下操作,而不使用分叉或使用后续的子/父进程)。当采用我上面展示的方法时,程序永远不会执行信号处理函数中的任何代码,即使它是 if 语句之前的 print 语句。

按照这个,我也试过了:

signalHandler(raise(SIGUSR1));

如果我的方法被禁止,请原谅,我来自 Python 背景。谢谢!

编辑:我需要程序自动发出信号,捕捉信号,打印消息然后停止执行。不使用 CLI。

【问题讨论】:

  • killsignal
  • @AjayBrahmakshatriya,我已经阅读了两者的 man7 文档,并且已经成功地使用这些调用终止了我的进程,但我需要能够打印消息而不是突然结束执行。
  • 检查我的答案。

标签: c process signals


【解决方案1】:

您可以使用kill 命令向进程发送信号。所有信号的列表都可以在signal 手册页上找到。

您可以使用ps 命令识别您的进程的pid,并将信号发送为

kill -10 <pid>

如果您想从终端外部发送信号,这是该方法。如果希望进程本身发送信号(或引发信号),可以使用raise as -

raise(SIGUSR1);

同样的演示是here

如果你想以编程方式从另一个进程发送信号,你可以使用kill as -

kill(pid, SIGUSR1);

【讨论】:

  • 嘿 Ajay,我已经阅读了这两个文档的 man7 文档,并且已经成功地使用这些调用终止了我的进程,但我需要能够打印消息而不是突然结束执行。我需要程序自动发出信号,捕捉信号,打印消息然后停止执行。不使用 CLI。
  • @cookie,-10 将使kill 发送SIGUSR1,这不会突然结束进程。您的处理程序将被调用。
  • @cookie,我已经编辑了关于进程如何在没有 CLI 的情况下将信号发送给自己的答案。
  • 谢谢!我相信我只是走错了路。我没有意识到我必须在使用 signal() 系统调用后引发信号。感谢您的帮助!
  • @cookie,详细说明一下,signal 系统调用将函数注册为具有特定信号级别的处理程序。而raise实际上发出了信号。如果您在注册处理程序之前发送信号,它将由默认的操作系统处理程序处理,它只是忽略SIGUSR1SIGUSR2,因此您什么也看不到
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-06
  • 2020-10-07
  • 1970-01-01
  • 2021-07-16
  • 2011-05-24
  • 2020-08-26
  • 2020-09-01
相关资源
最近更新 更多