《TCP/IP网络编程》 第10章 多进程服务器端(下)

10.3 信号处理

“子进程究竟何时终止?调用waitpid函数后要无休止地等待吗?”

父进程与子进程一样繁忙,因此不能只调用waitpid函数以等待子进程终止。

3.1 向操作系统求助

子进程终止的识别主体是操作系统,因此,若操作系统能把如下信息告诉正忙于工作的父进程,将有助于构建高效的程序。

“嘿,父进程!你创建的子进程终止了!”

此时父进程将处理子进程终止相关事宜。这就是信号处理(Signal Handing)机制。此处的“信号”是在特定事件发生时由操作系统向进程发送的消息。为了响应该消息,执行与消息相关的自定义操作的过程称为“处理”或“信号处理”。

3.2 关于JAVA的题外话:保持开放思维

“技术上要保持开放思维”

对技术有偏见相当于限制了自己的学习范围,希望各位摒弃偏见,希望各位以开放的思维多关注身边的技术。

3.3 信号与signal函数

下列进程和操作系统间的对话是帮助大家理解信号处理而编写的,其中包含了所有信号处理相关内容。

  • 进程:“嘿,操作系统!如果我之前创建的子进程终止,就帮我调用zombie_handler函数。”
  • 操作系统:“好的!如果你的子进程终止,我会帮你调用zombie_handler函数,你先把该函数要执行的语句编写好!”

上述对话中进程所讲的相当于“注册信号”过程,即进程发现自己的子进程结束时,请求操作系统调用特定函数。该请求通过如下函数调用完成(因此称此函数为信号注册函数)

#include <signal.h>
void (*signal(int signo, void (*func)(int)))(int);
/*
为了在产生信号时调用,返回之前注册的函数指针
函数名: signal
参数:int signo,void(*func)(int)
返回类型:参数类型为int型,返回 void 型函数指针
*/

调用上述函数时,第一个参数为特殊情况信息,第二个参数为特殊情况下将要调用的函数的地址值(指针)。发生第一个参数代表的情况时,调用第二个参数所指的函数。下面给出可以在 signal 函数中注册的部分特殊情况和对应的函数。

  • SIGALRM: 已到通过调用 alarm 函数注册时间
  • SIGINT: 输入 ctrl+c
  • SIGCHLD: 子进程终止

猜你喜欢

转载自blog.csdn.net/qq_38159549/article/details/89245890