socket写数据导致进程跨掉

1.       SIGPIPE Definition

管道破裂。这个信号通常在进程间通信产生,比如采用 FIFO( 管道 ) 通信的两个进程,读管道没打开或者意外终止就往管道写,写进程会收到 SIGPIPE 信号。此外用 Socket 通信的两个进程,写进程在写 Socket 的时候,读进程已经终止。

 

2.       SIGPIPE Action

linux 下写 socket 的程序的时候,如果尝试 send 到一个 disconnected socket 上,就会让底层抛出一个 SIGPIPE 信号。这个信号的缺省处理方法是退出进程,大多数时候这都不是我们期望的。

 

3.       SIGPIPE Dealwith

以下代码,即可安全的屏蔽 SIGPIPE

    struct sigaction sa;
    sa.sa_handler = SIG_IGN;
    sigaction( SIGPIPE, &sa, 0 );

 

另外一种方式 :

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 使用隐匿引用计数

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值