linux网络编程---慢系统调用和中断信号EINTR
来源:互联网 发布:pgone吸毒 知乎 编辑:程序博客网 时间:2024/06/07 01:56
我们用慢系统调用来描述那些可能永远堵塞的系统调用(函数调用),如:accept,read等。永远堵塞的系统调用是指调用有可能永远无法返回,多数网络支持函数都属于这一类。例如,如果没有客户连接到服务器上,则服务器对accept的调用就没有返回保证。类似的,如果客户从未发送过一行要求服务器回射的文本,则服务器对read的调用将永不返回。
但有一个函数我们不能自己重启:connect。如果这个函数返回INTER,我们就不能再调用它,否则返回错误。当connect失败则该套接字不可再用,必须关闭close(sd),我们不能对这样的套接字再次调用connect函数。必须重新调用socket()函数获得新的套接字。
当一个进程阻塞在一个慢系统调用函数的时候,捕获到一个信号,等到信号处理程序返回时,该慢系统调用函数可能返回一个EINTR错误。有些内核自动重启某些被中断的系统调用。为了便于移植,当我们编写一个捕获信号的程序时(多数并发服务器捕获SIGCHLD),我们必须对慢系统调用返回EINTR有所准备。
如下为一个对accept函数的处理例子:
for( ; ; ){ clien=sizeof(cliaddr); if((connfd=accept(listenfd,(SA*)&cliaddr,&clien))<0) { if(errno==EINTR)continue; else err_sys("accept error"); }}在这段代码中,我们所做的就是自己重启被中断的系统调用,这对于accept以及其他诸如read,write,select和open这样的函数是合适的。
但有一个函数我们不能自己重启:connect。如果这个函数返回INTER,我们就不能再调用它,否则返回错误。当connect失败则该套接字不可再用,必须关闭close(sd),我们不能对这样的套接字再次调用connect函数。必须重新调用socket()函数获得新的套接字。
0 0
- linux网络编程---慢系统调用和中断信号EINTR
- linux网络编程之慢系统调用被信号中断产生EINTR错误怎么解决总结
- 慢系统调用与信号中断
- 信号中断 与 慢系统调用
- 信号中断 与 慢系统调用
- 信号中断 与 慢系统调用
- 慢系统调用与信号中断(转)
- 信号中断 与 慢系统调用
- 信号中断 与 慢系统调用
- 信号中断 与 慢系统调用
- linux系统编程之信号(七):被信号中断的系统调用和库函数处理方式
- linux系统编程之信号(七):被信号中断的系统调用和库函数处理方式
- linux系统编程之信号(七):被信号中断的系统调用和库函数处理方式
- 十四、Linux系统编程-信号(一)中断、信号、中断和信号
- Linux网络编程中EAGAIN错误和EINTR错误
- Linux网络编程中EAGAIN错误和EINTR错误
- 唯快不破:Linux网络编程中EAGAIN错误和EINTR错误
- 关于信号中断与慢系统调用的深度发现
- html5开发Android应用屏幕适配问题
- http://en.wikipedia.org/wiki/List_of_IP_protocol_numbers
- Object-C 学习笔记(十六)---Foundation之NSMutableArray
- 13本java经典书籍有空看看
- achartengine开源项目 饼图修改
- linux网络编程---慢系统调用和中断信号EINTR
- linux之sed用法
- 字符串操作(1)
- 面试题(2013)
- Struts2基于注解的Action配置
- ECSide列表宽度问题
- HTML串口通信(续)
- javaScriptDay3-1
- nginx的client_max_body_size解决nginx+php上传大文件的问题