如何让MAC屏蔽SIGPIPE信号?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何让MAC屏蔽SIGPIPE信号?相关的知识,希望对你有一定的参考价值。

ssh最近会自己主动断开,查看debug 发现是SIGPIPE这个信号打出的断开连接,有那位大侠能帮助我解决这个问题,一种屏蔽SIGPIPE信号,或忽略这个信号?
signal(SIGPIPE, SIG_IGN) 网上说将这代码修改一下就可以,但我不知道写在那里?请那位大侠能够协助。

写在进程启动的main函数里面。
注意signal(SIGPIPE,SIG_IGN)是分为系统调用和库调用的。
其中有一个是只能起一次作用,即对收到的第一个SIGPIPE信号做忽略处理,后面的信号还是会按默认处理。
最好用sigaction来定义信号的行为。
参考技术A 三等功v

linux网络编程中需要注意的信号SIGPIPE

  在调试cs时,s端循环收,c端循环发,s端意外崩溃后,c端自动退出,终端提示SIGPIPE导致c端退出。man 7 signal:

SIGPIPE      13      Term    Broken pipe: write to pipe with no readers

  SIGPIPE发生在:写一个没有读的管道,默认动作是终止程序。man 2 write:

EPIPE  fd is connected to a pipe or socket whose reading end is closed.
              When this happens the writing process will also receive  a  SIG-
              PIPE  signal.  (Thus, the write return value is seen only if the
              program catches, blocks or ignores this signal.)

  write的错误码EPIPE发生在写的fd对应的pipe或者socket对端的读端关闭了时。写操作的返回值仅当程序捕获,阻塞,忽略此信号时才能收到,因为SIGPIPE默认会终止程序。

  有一个细节,使用gdb单步调试c端,在开始write前,手动终止s端,c端收到s的FIN分节,并回复ack,c端处于CLOSE_WAIT状态,此时,c端的write操作返回的数值是正常的,socket状态不存在了,wireshark抓包会发现一个RST包,表示socket连接已重置,再次write,将会立即收到SIGPIPE。准确的讲写一个已经收到RST分节的socket会产生SIGPIPE。

以上是关于如何让MAC屏蔽SIGPIPE信号?的主要内容,如果未能解决你的问题,请参考以下文章

Java Socket 怎么忽略SIGPIPE信号

什么信号(SIGPIPE,SIG_IGN);做?

SIGPIPE

SIGPIPE信号解析

收到信号:SIGPIPE(断管)

避免SIGPIPE导致的iOS应用闪退/Avoiding SIGPIPE signal crash in iOS(mach_msg_trapSIGPIPE信号)