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

baw*_*nal 7 c linux kernel signals

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

任何指针都将非常感激.

Nem*_*ric 5

这是内核为我们做的事情.您可以通过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                 }
Run Code Online (Sandbox Code Playgroud)

所以,如果有一个信号处理程序,如果它不是"忽略信号"(SIG_IGN),如果它不是"默认"处理程序(SIG_DEF),内核将只是标记它是否正在运行(并且取决于它是否一次性它将移动处理程序再次默认处理程序).

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

2330                 /*
2331                  * Anything else is fatal, maybe with a core dump.
2332                  */
Run Code Online (Sandbox Code Playgroud)

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