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 Read More...

C/C++中的逗号分割符

逗号分割只返回最后的一个表达式的结果(从左到右)。如:

while ( a<b, a<c, a==d ) {}
// 只有 a==d 才起作用。


可以在一个语句中进行多个操作。如:
for ( b--, a++, d += a;
    printf ("a:%d b:%d  ", a, b), b < d;
    b++, a--, printf ("d:%d\n", d));

//EOF Read More...