EINTR返回值到处理

来源:互联网 发布:vb中shell函数 编辑:程序博客网 时间:2024/04/29 17:41

在《UNIX Networking programming》Chapte5中论述了“slow system call"的概念, 而且给出了EINTR的处理方法。

慢系统调用(slow system call):此术语适用于那些可能永远阻塞的系统调用。永远阻塞的系统调用是指调用有可能永远无法返回,多数网络支持函数都属于这一类。如:若没有客户连接到服务器上,那么服务器的accept调用就没有返回的保证。

EINTR错误的产生:当阻塞于某个慢系统调用的一个进程捕获某个信号且相应信号处理函数返回时,该系统调用可能返回一个EINTR错误。例如:在socket服务器端,设置了信号捕获机制,有子进程,当在父进程阻塞于慢系统调用时由父进程捕获到了一个有效信号时,内核会致使accept返回一个EINTR错误(被中断的系统调用)。

当碰到EINTR错误的时候,可以采取有一些可以重启的系统调用要进行重启,而对于有一些系统调用是不能够重启的。例如:accept、read、write、select、和open之类的函数来说,是可以进行重启的。不过对于套接字编程中的connect函数我们是不能重启的,若connect函数返回一个EINTR错误的时候,我们不能再次调用它,否则将立即返回一个错误。针对connect不能重启的处理方法是,必须调用select来等待连接完成。



对EINTR的处理  

2012-04-23 15:26:51|  分类:linux |举报|字号 订阅

EINTR

  linux中函数的返回状态,在不同的函数中意义不同:

1)write

  表示:由于信号中断,没写成功任何数据。  The call was interrupted by a signal before any data was written.

2)read

  表示:由于信号中断,没读到任何数据。  The call was interrupted by a signal before any data was read.

3)sem_wait

  函数调用被信号处理函数中断  The call was interrupted by a signal handler.

4)recv

  由于信号中断返回,没有任何数据可用。  function was interrupted by a signal that was caught, before any data was available.


http://blog.csdn.net/yanook/article/details/6547675

调用系统调用的时候,有时系统调用会被中断.此时,系统调用会返回-1,并且错误码被置为EINTR.但是,有时并不将这样的情况作为错误.有两种处理方法:

1.如果错误码为EINTR则重新调用系统调用,例如Postgresql中有一段代码:

 

view plaincopy to clipboardprint?
  1. retry1:   
  2.     if (send(port->sock, &SSLok, 1, 0) != 1)   
  3.     {   
  4.         if (errno == EINTR)   
  5.             goto retry1;    /* if interrupted, just retry */  
[cpp] view plaincopy
  1. retry1:  
  2.     if (send(port->sock, &SSLok, 1, 0) != 1)  
  3.     {  
  4.         if (errno == EINTR)  
  5.             goto retry1;    /* if interrupted, just retry */  

 

2.重新定义系统调用,忽略错误码为EINTR的情况.例如,Cherokee中的一段代码:

 

view plaincopy to clipboardprint?
  1. int  
  2. cherokee_stat (const char *restrict path, struct stat *buf)   
  3. {   
  4.     int re;   
  5.     do {   
  6.         re = stat (path, buf);   
  7.     } while ((re == -1) && (errno == EINTR));   
  8.     return re;   
  9. }  



0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 宜家柜子味道重怎么办 家里有小飞虫怎么办呀 汽车里进老鼠了怎么办 老鼠跑到车里了怎么办 我的小车有老鼠怎么办 车里面进了老鼠怎么办 街电充电宝丢了怎么办 充电宝充不了电怎么办 脚裸扭伤肿了怎么办 大货车电瓶亏电怎么办 货车电瓶被偷了怎么办 小乌龟尾巴断了怎么办 长青春痘怎么办简单小妙招 一关灯就有蚊子怎么办 狗狗误食蟑螂药怎么办 泰迪误食蟑螂药怎么办 猫咪吃了蟑螂药怎么办 狗把蟑螂药吃了怎么办 猫吃了蟑螂诱饵怎么办 猫吃了蟑螂中毒怎么办 孕妇胃烧的难受怎么办 6个月孕妇胃难受怎么办 飞机杯吸盘不上怎么办 我的车位被占用怎么办 占别人车位的车怎么办 头受凉受风了疼怎么办 看电脑时间长了眼睛疼怎么办 电脑玩久了头疼怎么办 屋里有死老鼠味怎么办 老鼠死在车里面怎么办 手机锁屏怎么办求解锁 玩lol左键失灵怎么办 小米鼠标没电了怎么办 电脑键盘鼠标没反应怎么办 win10玩游戏很卡怎么办 鞋子夹脚怎么办小妙招 新鞋两边夹脚怎么办 新鞋子两边夹脚怎么办 鞋子瘦两边夹脚怎么办 鞋子小脚趾磨脚怎么办 鞋子买小了顶脚怎么办