首页 > 编程知识 正文

signal(dhcp服务异常手机怎么修复)

时间:2023-05-04 12:33:02 阅读:67850 作者:2171

1 .原因一个对象对已经关闭的套接字调用write两次,第二次生成SIGPIPE信号,该信号默认终止该过程。

具体分析可以与TCP关闭的“四次握手”相结合。 TCP可以是全双工信道,也可以被认为是两个单个信道,TCP连接两端的两个端点各自负责一个。 对方调用close时,意图关闭整个两个信道,但本地只接收FIN数据包。 根据TCP协议的语义,它表明对方只要关闭了负责的单通道,就可以继续接收数据。 也就是说,由于TCP协议的限制,一个端点不能知道对方的套接字是调用了关闭还是关闭。

对接收FIN包的套接字调用read方法,如果接收缓冲区为空,则返回0。 这意味着连接已关闭。 但是,在对此第一次调用write方法时,如果发送缓冲器没有问题,则返回正确的写入(发送)。 但是,发送的消息会让对方发送RST消息。 对方的套接字已经调用了close,所以完全关闭,既不发送也不接收。 因此,第二次write方法调用将在收到RST后生成SIGPIPE信号,并终止该过程。

在linux上编写套接字程序时,如果尝试向断开连接的套接字发送send,则会向基础发送SIGPIPE信号。

这个信号的默认处理方法是终止该过程,在很多情况下这不是我们所期望的。

2 .可以捕获或忽略SIGPIPE信号,以免方法过程终止。 方法如下。

(1)间接忽略staticvoidsignalhandler (intnsigno ) (signal ) n signo,signalHandler ); 交换机(n signo ) casesigpipe : printf (processwillnotexitn ); 布雷克; d fault : printf (' % dsignalunregistern ',nSigno ); 布雷克; } } atic void InitSignalHandler (() signal ) ) SIGpipe,SignalHandler ); } int main () { InitSignalHandler ); return 0; (2)直接忽略signal(SIGpipe,SIG_IGN ); (3) sign动作结构sa重载; sa.sa_handler=SIG_IGN; sigaction(SIGpipe,sa,0 ); 3 .其他正常情况下,(1)、(2)、(3)可以。

(1)2)3)如果在收到SIGPIPE后流程仍将终止,可能的原因之一如下:

研究名为SIGPIPE的信号特性:

当读取过程在管道写入过程中终止时,将生成此信号。 如果SOCK_STREAM类型的套接字不再连接,则进程写入套接字时也会生成此信号。 —— 《UNIX环境高级编程》中第10.2节

客户端使用send ()发送数据,但在man文档中使用send ) )查看函数时,会发现以下内容:

msg _ nosignalrequestsnottosendsigpipeonerrorsonstreamorientedsocketswhentheotherendbreakstheconnection.theepiperroristililion SIGPIPE被忽略,客户端没有因该信号而退出。

【参考】http://blog.Sina.com.cn/s/blog _ 502 d 765 f 0100 kopn.html

3358 blog.csdn.net/wo Xiaozhi/article/details/40624033】

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。