2007-03-11

NOSIGPIPE

在Unix系统下,如果send/recv在等待协议传送数据时网络断开的话,调用send/recv的进程会接收到一个SIGPIPE信号,进程对该信号的默认处理是进程终止。
处理方法:
在初始化时调用signal(SIGPIPE,SIG_IGN)忽略该信号(只需一次)
其时send或recv函数将返回-1,errno为EPIPE,可视情况关闭socket或其他处理
gdb:
gdb默认收到sigpipe时中断程序,可调用handle SIGPIPE nostop print

另外,FreeBSD/MacOSX中有个 SO_NOSIGPIPE 可通过setsockopt设置

SO_NOSIGPIPE    do not generate SIGPIPE, instead return EPIPE
(见FreeBSD的setsockopt(2))


但找了半天我的FC6 Linux中却没得 SO_NOSIGPIPE。。。
只好用signal(SIGPIPE,SIG_IGN)吧。
//EOF

0 comments: