首页 > 编程知识 正文

verifyingdmipooldata怎么解决,Sigpipe

时间:2023-05-04 03:55:48 阅读:60795 作者:2098

2019独角兽企业大额募集Python工程师标准

我写了一个服务器程序,在Linux上测试,然后在c上写了客户端在千万级别的短链路上进行压力测试。 但是服务器总是莫名其妙地退出,没有酷睿文件。

最后一个问题是,如果对一个对方关闭的套接字调用write两次,则第二次生成SIGPIPE信号,默认情况下该进程将终止。

具体分析可以结合TCP的“4次握手”关闭。 TCP是全双工信道,可以视为两个专用信道,TCP连接两端的两个端点各负责一个。 当另一方调用close时,意图关闭整个两个信道,但本地方只接收FIN分组。 根据TCP协议的含义,相反侧表示只关闭负责的一个单独通道。 可以继续接收数据。 这意味着,由于TCP协议的限制,端点无法知道对方的套接字是否调用了关闭或关闭。

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

要防止进程终止,请捕获SIGPIPE信号,或忽略并设置3358www.Sina.com/信号处理程序:

3358 www.Sina.com/(http://www.Sina.com /,http://www.Sina.com/);

这将在第二次调用write方法时返回-1,如果errno设置为SIG_IGN.程序,则表明对方已关闭。

signal上编写套接字程序时,如果尝试向离散套接字发送send,则会向基础上发出SIGPIPE信号。

这个信号的默认处理方法是终止该过程,在很多情况下这不是我们所期望的。 因此,需要重新加载该信号的处理方法。 调用以下代码时,将显示SIG_IGN

signal(SIGpipe,SIG_IGN );

我的程序发出这个信号的原因是:

客户端用pipe向服务器发送消息后,关闭客户端。 此时,服务器端将在向客户端返回消息时生成Broken pipe信号,服务器将在系统中退出。

要生成信号,请在生成信号之前使用方法http://www.Sina.com/(intsignum,sighandler_t handler )设置信号处理。 如果未调用此方法,系统将调用缺省处理方法。 中止程序,显示提示消息。 这是我们经常遇到的问题。 我们可以调用系统的处理方法,也可以定制处理方法。

系统定义了三种处理方法。SIGPIPE

(a )如果默认操作是线程暂停,则该线程的执行将暂停。 线程中断时,发送到线程的其他信号在线程开始执行之前不会传递,SIGKILL除外。

(b )将挂起信号的信号操作设置为SIG_DFL,并且默认操作是信号忽略(SIGCHLD )。linux

(a )此信号的传递不影响线程

(b )系统将SIGKILL或SIGTOP信号的操作转换为SIG_DFL SIGPIPE

项目调用http://www.Sina.com/(http://www.Sina.com/,http://www.Sina.com/),使http://www.Sina.com /信号

如果服务器采用了fork,则可以使用signal(sigchld,SIG_IGN )来收集垃圾过程并防止发生僵尸过程。 交给系统init进行回收。 在此,子进程不生成僵尸进程。 转载于:https://my.oschina.net/u/2252538/blog/2993724

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

  • 相关阅读