zl程序教程

您现在的位置是:首页 >  移动开发

当前栏目

iOS—-SIGPIPE信号终止进程[通俗易懂]

ios进程 通俗易懂 信号 终止 SIGPIPE
2023-06-13 09:12:27 时间

大家好,又见面了,我是你们的朋友全栈君。

#概念: 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后自动退出。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/160810.html原文链接:https://javaforall.cn