当前位置: 首页 > 面试题库 >

是否可以向处理程序发出信号,使其在执行“ exec”之后继续生存?

傅峻
2023-03-14
问题内容

我为进程编写了一个信号处理程序,然后编写了fork(),该信号处理程序将同时应用于父进程和子进程。如果我将子进程替换为“
exec”,则信号处理程序将不再可用。

我知道发生这种情况是因为“ exec”调用将使用其自身覆盖子进程地址空间。我只想知道即使在“ exec”调用之后是否有一种方法可以使信号处理程序正常工作?


问题答案:

否。从man页面:

execve()不会成功返回,并且调用过程的文本,数据,bss和堆栈会被加载的程序覆盖。调用的程序将继承调用进程的PID,以及所有未设置为在exec上关闭的打开文件描述符。呼叫过程中待处理的信号被清除。设置为由呼叫过程捕获的任何信号都将重置为其默认行为。SIGCHLD信号(设置为SIG_IGN时)可能会也可能不会重置为SIG_DFL。

实际上,如果在代码被一些非常不同的代码替换之后,信号处理程序仍然处于活动状态,那么您可能会在信号出现时遇到各种混乱。毕竟,信号处理程序只是发生某种情况(折扣SIG_IGNSIG_DFL暂时)时要调用的地址。谁知道当您替换整​​个文本段时,该地址处的代码是什么?



 类似资料:
  • 基本上,我希望每次有0除法时都进入处理程序。它应该在函数中执行所需的任何操作,然后继续循环的下一次迭代。 这对其他需要处理的信号也应该起作用。如有任何帮助,不胜感激。

  • #include <stdio.h> #include <signal.h> void handler(int sig); void handler(int sig) { signal(sig, handler); printf("Receive signal: %d\n", sig); } int main(void) { signal(SI

  • 我制作了一个程序,要求用户输入5位数字,然后程序将查找这些数字的总和。我想知道我怎样才能使程序在计算一次之后一遍又一遍地要求一个数字。我希望用户再试一次,直到他自己想退出。

  • #include <stdio.h> #include <signal.h> void handler(int sig); void handler(int sig) { signal(sig, handler); printf("Receive signal: %d\n", sig); } int main(void) { signal(SI

  • 问题内容: 我正在尝试停止执行例程,但是我找不到实现此目的的方法。我当时在考虑使用第二个频道,但是如果我从中读取它会阻止它,不是吗?这是一些代码,我希望这些代码可以解释我要做什么。 玩这个东西 问题答案: 实现这一点的方法很少,最简单,最方便的是使用其他渠道,例如: 您也可以研究使用

  • 问题内容: 我的示例代码如下: 我的要求是,在捕获到异常之后,我要处理数组的其余元素。我怎样才能做到这一点? 问题答案: 您的代码应如下所示: