常见可能导致服务器莫名退出需要(SIG_IGN)的信号

在编写项目时可能会遇见连接或者进程莫名退出的情况,不会报错也很按找出原因,通过日志不断定位,最终发现与信号有关

一下列出我在项目中遇见过的常见需要改变默认处理动作的信号

可以通过  函数: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信号。

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值