我知道当我们按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/

10-12 12:34
查看更多