1. SIGPIPE Definition
管道破裂。这个信号通常在进程间通信产生,比如采用 FIFO( 管道 ) 通信的两个进程,读管道没打开或者意外终止就往管道写,写进程会收到 SIGPIPE 信号。此外用 Socket 通信的两个进程,写进程在写 Socket 的时候,读进程已经终止。
2. SIGPIPE Action
在 linux 下写 socket 的程序的时候,如果尝试 send 到一个 disconnected socket 上,就会让底层抛出一个 SIGPIPE 信号。这个信号的缺省处理方法是退出进程,大多数时候这都不是我们期望的。
3. SIGPIPE Dealwith
以下代码,即可安全的屏蔽 SIGPIPE :
struct sigaction sa; |
另外一种方式 :
signal(SIGPIPE, SIG_IGN ); |
4. Socket 线程不安全
将一个文件或 SOCKET 的句柄 fd 传递给多个线程,进行读、写和 Close 操作,是否安全了?答案是 “ 否 ” ,这类似于 new 一个指针后,这个指针传递给多线程是否安全,结果是常常容易造成一个线程使用已经被另一个线程 delete 的指针。
对 fd 的各系统调用本身是线程安全的,比如可以多线程同时 read/write ,但是当一个 fd 被 close 之后,它就相当于成了野指针,而且类似于指针,这个 fd 还会被重用,可能被重新赋值了,这两种情况都可能造成严重问题,野 fd 可能导致内核 coredump (一般在系统日志里有记录)。
出现问题的根源是因为一个线程 close 了 fd ,但另一线程仍在使用,只有在下列情形才会安全: 1.fd 还未被重分配 2. 系统调用发生之前或已经未使用 fd (系统调用在使用之前通常会检查 fd 参数是否有效)
如果解决这样的问题了?办法类似于指针,使用引用计数,如何使用引用计数?两个办法: 1. 应用自己包装一层,维护显示的引用计数 2. 使用 dup 使用隐匿引用计数
|