gpt4 book ai didi

c - ELF 二进制文件中默认信号处理程序的代码在哪里?

转载 作者:IT王子 更新时间:2023-10-29 00:31:31 26 4
gpt4 key购买 nike

我知道当我们按下 Ctrl+C 时,会发出一个 SIGINT 信号,并且终止进程的默认操作将由内核完成。但是这个终止的代码是从哪里来的呢?它是在 ELF 二进制文件中还是内核为我们做的?我认为它在内核中,这就是为什么我们需要在源代码中自定义处理程序来覆盖信号行为。

任何指点将不胜感激。

最佳答案

这是内核为我们做的事情。您可以通过阅读内核源代码中的 signal.c 文件找到所有信息。

内核试图找到已注册信号处理程序的点从这里开始:http://lxr.free-electrons.com/source/kernel/signal.c#L2257

2257                 ka = &sighand->action[signr-1];
2258
2259 /* Trace actually delivered signals. */
2260 trace_signal_deliver(signr, &ksig->info, ka);
2261
2262 if (ka->sa.sa_handler == SIG_IGN) /* Do nothing. */
2263 continue;
2264 if (ka->sa.sa_handler != SIG_DFL) {
2265 /* Run the handler. */
2266 ksig->ka = *ka;
2267
2268 if (ka->sa.sa_flags & SA_ONESHOT)
2269 ka->sa.sa_handler = SIG_DFL;
2270
2271 break; /* will return non-zero "signr" value */
2272 }

因此,如果有一个信号处理程序并且它不是“忽略信号”(SIG_IGN)并且如果它不是“默认”处理程序(SIG_DEF),内核将简单地将其标记为正在运行(并且取决于它是否是一次性的,它将处理程序再次移动到默认处理程序)。

但是,如果没有注册信号处理程序,或者它是 SIG_DEF,内核会检查是否需要暂停进程,最后内核声明如下:

2330                 /*
2331 * Anything else is fatal, maybe with a core dump.
2332 */

http://lxr.free-electrons.com/source/kernel/signal.c#L2330

关于c - ELF 二进制文件中默认信号处理程序的代码在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32625896/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com