【问题标题】:Raising Signals and using Handlers in C在 C 中引发信号和使用处理程序
【发布时间】:2023-03-15 04:58:01
【问题描述】:

我有一个需要使用信号和处理程序的程序。我有两个子进程应该接收用户定义的信号,一个应该对信号不做任何事情,而另一个应该打印出一些通用消息,睡眠,然后打印出另一条指示停止结束的消息.应该对信号不做任何事情的一个子进程应该是发出信号的那个。

我很确定信号是用符号signal(SIGINT, handler); 上升的,所以我只需将它放在由一个子进程定义的函数中,但我如何将信号“发送”到两个进程?我怎么能在一组条件下说一个进程接收信号并按照处理程序的指示执行操作,而另一个进程接收信号并且什么也不做?

我正在阅读有关kill(pid, handler) 如何能够将指定进程发送到处理程序的信息,但是每当我尝试它时,它都会告诉我 kill 的参数 1 从没有强制转换的指针中生成整数。

我的程序是一个阅读器/编写器程序,它几乎没有明确的目的测试概念,现在,都在一个源文档中,但将被分成一个阅读器源来定义阅读器进程的功能,一个writer 源,它将定义 writer 进程的功能,然后是创建两个子进程的主要源。我还将有一个头文件,它将定义所有必要的常量和函数原型,但是现在,如果我可以从这个源中让它工作,我可以稍后弄清楚如何将它分成多个源。

【问题讨论】:

  • signal 注册一个信号处理程序;它不会发出信号。
  • 首先,如果您还没有看过 GNU C 手册中关于信号的章节,您的大部分问题都会得到解答:gnu.org/software/libc/manual/html_node/Signal-Handling.html
  • @spade78 感谢您的参考 - 我一定会仔细阅读以更好地了解信号的情况。我的导师主要给我代码来尝试查看和破译正在发生的事情,这就是为什么我认为signal 会发出信号,因为当我运行给定代码段的调试会话时,它似乎在做这件事.在全网挖掘解释时,我从未遇到过此资源。然而不幸的是,人们坚持因为我缺乏理解而惩罚我。
  • 您可能还想查看open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf的标准7.14.1
  • @Newwisdom01 - 这不是惩罚,只是在处理家庭作业时,在哪里划清帮助和直接提供答案之间的界限。

标签: c handler signals


【解决方案1】:

此答案基于我对GNU C Manual's chapter on signals 的阅读。

正如 Kerrek 所说,signal() 允许进程向操作系统注册,表明该进程希望操作系统向其传递感兴趣的信号。生成信号后,signal() 的 sighandler_t 参数指定进程将执行的操作,默认处理 (SIG_DFL),忽略信号 (SIG_IGN),或者由传递给 signal() 的处理函数定义的自定义操作。 )。该处理函数用于定义一个进程的行为,以便在将信号传递给它时对其进行处理。

第二个进程的工作是在 sleep() 一段时间后发出指定的信号,因此它将使用 kill(pid, signum) 函数来执行此操作,该函数将预期接收者的 PID 和信号传递给说收件人。

【讨论】:

  • 您之前提供的参考资料消除了我对信号实际是什么的许多误解。谢谢你。目前,我认为通过使我的进程的 ID 变量全局化,访问它们并通过 kill 使用信号是可行的,但我无法对其进行测试,因为我当前的代码无法编译。不过,这不是我的问题的范围,所以我会插上它并尝试让它工作。然后,当函数被拆分为不同的源文件时,我可以稍后再担心访问所有内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-06
  • 1970-01-01
  • 2011-09-25
  • 2014-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多