美文网首页Signal 信号Crash知识bugs
iOS----SIGPIPE信号终止进程

iOS----SIGPIPE信号终止进程

作者: struggle3g | 来源:发表于2018-03-12 18:15 被阅读326次

概念:

SIGPIPE,当一个程序a调用send函数向一个服务A发送信号的数据,服务A在接收数据的时候突然挂掉、无法接收数据、没有接收者,那么内核就会发送一个SIGPIPE信号,从而中断进程,导致程序退出。

调用signal(SIGPIPE, SIG_IGN);

对一个已经收到FIN包的socket调用read方法,
如果接收缓冲已空, 则返回0, 这就是常说的表示连接关闭. 但第一次对其调用write方法时, 如果发送缓冲没问题, 会返回正确写入(发送).
但发送的报文会导致对端发送RST报文, 因为对端的socket已经调用了close, 完全关闭, 既不发送, 也不接收数据. 所以,
第二次调用write方法(假设在收到RST之后), 会生成SIGPIPE信号, 导致进程退出.
为了避免进程退出, 可以捕获SIGPIPE信号, 或者忽略它, 给它设置SIG_IGN信号处理函数:
signal(SIGPIPE, SIG_IGN);
这样, 第二次调用write方法时, 会返回-1, 同时errno置为SIGPIPE. 程序便能知道对端已经关闭.

总结

signal(SIGPIPE, SIG_IGN)的作用就是防止程序收到SIGPIPE后自动退出。

相关文章

  • iOS----SIGPIPE信号终止进程

    概念: SIGPIPE,当一个程序a调用send函数向一个服务A发送信号的数据,服务A在接收数据的时候突然挂掉、无...

  • Unix环境高级编程-第八章

    当一个进程正常或一场终止时,内核就向其父进程发送SIGCHLD信号。因为子进程终止是个异步时间,所以这种信号也是内...

  • native调试方法

    linux错误信号 Term 终止进程Core 输出core dump 信号 取值 默认动作 含义...

  • Linux命令之kill(18)

    发送指定的信号到相应进程。 不指定型号将发送SIGTERM(15)终止指定进程。如果无法终止该程序可用"-KILL...

  • 2018-01-25 SIGKILL SIGINT SIGTER

    1)SIGKILLSIGKILL信号被发送到一个进程,使其立即终止(kill)。 SIGINT程序终止(inter...

  • linux中kill命令的使用

    先来看下经常用到的信号 信号默认行为描述信号值SIGHUP终止当进程的控制终端关闭时,HUP信号会被发送到进程1S...

  • 二 信号

    Linux常用信号1-SIGHUP挂起进程2-SIGINT终止进程3-SIGQUIT停止进程9-SIGKILL无条...

  • 10-3 信号

    三、信号 kill 命令通常用来“ 杀死 ”(终止)进程,它可以用来终止运行不正常的程序 或 拒绝终止的程序。如下...

  • kill信号大全

    信号量 killall 杀死同一进程组内的所有进程,允许指定要终止的进程的名称,而非pid

  • liunx 下常用命令

    强制杀死进程: kill -s 9 1827 其中-s 9 制定了传递给进程的信号是9,即强制、尽快终止进程。各个...

网友评论

    本文标题:iOS----SIGPIPE信号终止进程

    本文链接:https://www.haomeiwen.com/subject/ujznfftx.html