linux网络编程中要注意信号量

Linux编程中往往程序会莫名其妙的在write,send等地方退出,如果有这种问题需要注意是不是信号量引起的。

网络编程中可以有选择性的使用signal函数处理某些信号,下面介绍几个常用的信号。​

1、SIGPIPE

产生原因:

TCP的"四次分手"关闭. TCP是全双工的信道, 可以看作两条单工信道, TCP连接两端的两个端点各负责一条. 当对端调用close时, 本端只是收到FIN包. 按照TCP协议的语义, 表示对端只是关闭了其所负责的那一条单工信道。也就是说, 因为TCP协议的限制, 一个端点无法获知对端的socket是调用了close还是shutdown。对一个已经收到FIN包的socket调用read方法如果接收缓冲已空则返回0, 这就是常说的表示连接关闭但第一次对其调用write方法时如果发送缓冲没问题会返回正确写入(发送). 但发送的报文会导致对端发送RST报文因为对端的socket已经调用了close, 完全关闭既不发送也不接收数据所以第二次调用write方法(假设在收到RST之后), 会生成SIGPIPE信号导致进程退出

解决方法:

为了避免进程退出可以捕获SIGPIPE信号或者忽略它给它设置SIG_IGN信号处理函数

signal(SIGPIPE, SIG_IGN);

​2、SIGTTIN SIGTTOU

产生原因:

​后台进程从终端读取数据时所有进程会收到SIGTTIN信号,默认处理进程会停止运行。

后台进程向终端写数据时所有进程会收到SIGTTOU信号,默认处理进程会停止运行​。

解决办法:

​signal(SIGTTIN, SIG_IGN);​

signal(SIGTTOU, SIG_IGN);

3、​SIGINT SIGQUIT

产生原因:

SIGINT,终止进程信号,由Ctrl+C发出。

SIGQUIT,终止进程信号,有Ctrl+\发出。

解决办法:

signal(SIGINT,SIG_IGN);

signal(SIGQUIT,SIG_IGN);

转载于:https://www.cnblogs.com/luiz/p/6828831.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值