tcp send 函数导致进程退出

本文介绍了在Linux环境下如何避免因向已断开连接的socket发送数据而产生的SIGPIPE信号,默认情况下该信号会导致进程退出。文章提供了两种解决方案:一是通过重新定义SIGPIPE信号的处理方式;二是使用send函数的MSG_NOSIGNAL标志。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、在linux下写socket的程序的时候,如果尝试send到一个disconnected socket上,就会让底层抛出一个SIGPIPE信号。这个信号的缺省处理方法是退出进程。因此我的处理方法很简单,重新定义这个信号的处理方式,使用:

void signal_func() { 
}

signal(SIGPIPE,signal_func);

这样程序就不会退出了

2、在linux下send函数原型为:

#include <sys/types.h>
#include <sys/socket.h>

ssize_t send(int sockfd, const void *buf, size_t len, int flags);

其中“flags”被忽略了,一般设置为0,但当flags为0时,如果客户端断开,继续往里边写数据的话,会引发一个信号SIGPIPE,此信号会引发线程的退出。

所以,将“flags”设置为MSG_NOSIGNAL,则不会导致线程退出。

MSG_NOSIGNAL的含义,通过man send,说明如下:

 MSG_NOSIGNAL (since Linux 2.2)
              Requests not to send SIGPIPE on errors on stream oriented sockets when  the
              other end breaks the connection.  The EPIPE error is still returned.

意思是,当对方断开连接导致错误时,不发送SIGPIPE信号。但还是会返回EPIPE错误。

于是,只需要判断send是否成功就可以了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值