EINTR error

来源:互联网 发布:外国电视台直播软件 编辑:程序博客网 时间:2024/04/19 09:54

EINTR error

总结:本问介绍了EINTR错误产生的原因,以及如何解决,并在最后给出一个实例,通过该实例可以解决调用ioctl产生的EINTR错误。

一. EINTR

1.EINTR错误产生的原因;

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

2.如何解决:

当碰到EINTR错误的时候,可以采取有一些可以重启的系统调用进行重启,而对于有一些系统调用是不能够重启的。例如:acceptreadwiretseletcioctlopen之类的函数来说是可以进行重启的。不过对于套接字编程中的connect函数是不能进行重启的。若connetct函数返回一个EINTR错误的时候,则不能再次调用它,否则将返回一个错误。针对connect不能重启的特性,必须调用select函数来等待连接完成。

补充:慢系统调用(slow system call)

该术语适用于那些可能永远阻塞的系统调用。永远阻塞的系统调用是指调用永远无法返回,多数网络支持函数都属于这一类。

二实例

该实例解决了调用ioctl时,产生EINTR的解决方法。

#include <stdio.h>#include <errno.h>/***function name: xioctl*description:*Do ioctl and retry if error was EINTR(“A signal was caught during the ioctl() operation”)*Note:*ENTR:被信号中断函数*/ static  int  xioctl(int fd,int requrest, void *argp){   int ret;   do {         ret = ioctl(fd,request,argp);}while(-1 == ret && ENTR==errno);return ret;}} 


原创粉丝点击