在编写项目时可能会遇见连接或者进程莫名退出的情况,不会报错也很按找出原因,通过日志不断定位,最终发现与信号有关
一下列出我在项目中遇见过的常见需要改变默认处理动作的信号
可以通过 函数:kill(pid,0) 或 命令行:kill -0 pid 对进程进行检测,0不会发送任何信号,但是会进行错误检查,如果进程存在,命令返回0!
signal(SIGHUP, SIG_IGN);//忽略终端会话父进程退出信号
SIGHUP 信号在用户终端连接(正常或非正常)结束时发出, 通常是在终端的控制进程结束时, 通知session(会话)内的各个作业, 这时它们与控制终端不再关联.。
SIGHUP信号默认处理动作是终止收到该信号的进程。所
以若程序中没有捕捉该信号,当收到该信号时,进程就会退出。
SIGHUP会在以下3种情况下被发送给相应的进程:
1、终端关闭时,该信号被发送到session首进程
2、session首进程退出时,该信号被发送到该session中的前台进程组中的每一个进程;
3、若父进程退出导致进程组成为孤儿进程组,且该进程组中有进程处于停止状态(收到SIGSTOP或SIGTSTP信号),该信号会被发送到该进程组中的每一个进程。
例如:在我们登录Linux时,系统会分配给登录用户一个终端(Session)。在这个终端运行的所有程序,包括前台进程组和后台进程组,一般都属于这个 Session。当用户退出Linux登录时,前台进程组和后台有对终端输出的进程将会收到SIGHUP信号。这个信号的默认操作为终止进程,因此前台进 程组和后台有终端输出的进程就会中止。
来源:https://blog.csdn.net/z_ryan/article/details/80952498
signal(SIGPIPE, SIG_IGN);//忽略管道退出信号
这个信号最常见,因为socket编程中,进程通信使用管道次数不少,当向一个写端关闭的管道,或者说close一个连接时,再往服务器上发送数据,就会产生SIGPIPE信号,告诉进程已经关闭无法写入,导致进程退出。所以忽略这个信号非常重要!
signal(SIGTTOU, SIG_IGN);//读 signal(SIGTTIN, SIG_IGN);//写
当一个进程以后台形式启动并尝试读写控制台终端时,将会触发SIGTTOU(读)和SIGTTOU(写)
信号量,进程将暂停
,read/write将会返回错误。将两信号忽略之后,不把进程切换至前台也不影响读写
signal(SIGCHLD, SIG_IGN);//忽略子进程退出信号,防止僵尸进程
子进程结束时, 父进程会收到这个信号。 子进程终结之后需要服务器进程去wait清理资源
如果父进程没有处理这个信号,也没有等待(wait)子进程,子进程虽然终止但是会变成为僵尸进程。 为了防止僵尸进程占用系统资源,父进程或者忽略SIGCHILD信号。