慢系统调用(slow system call):此术语适用于那些可能永远阻塞的系统调用。永远阻塞的系统调用是指调用有可能永远无法返回,多数网络支持函数都属于这一类。如:若没有客户连接到服务器上,那么服务器的accept调用就没有返回的保证。
EINTR错误的产生:当阻塞于某个慢系统调用的一个进程捕获某个信号且相应信号处理函数返回时,该系统调用可能返回一个EINTR错误。例如:在socket服务器端,设置了信号捕获机制,有子进程,当在父进程阻塞于慢系统调用时由父进程捕获到了一个有效信号时,内核会致使accept返回一个EINTR错误(被中断的系统调用)。
当碰到EINTR错误的时候,可以采取有一些可以重启的系统调用要进行重启,而对于有一些系统调用是不能够重启的。例如:accept、read、write、select、和open之类的函数来说,是可以进行重启的。不过对于套接字编程中的connect函数我们是不能重启的,若connect函数返回一个EINTR错误的时候,我们不能再次调用它,否则将立即返回一个错误。针对connect不能重启的处理方法是,必须调用select来等待连接完成。
write
表示:由于信号中断,没写成功任何数据。
The call was interrupted by a signal before any data was written.
read
表示:由于信号中断,没读到任何数据。
The call was interrupted by a signal before any data was read.
sem_wait
函数调用被信号处理函数中断
The call was interrupted by a signal handler.
recv
由于信号中断返回,没有任何数据可用。
function was interrupted by a signal that was caught, before any data was available.
转载自:
1,http://baike.baidu.com/link?url=xqFxBws-PHfDprwHn-TTWdVyfd8cuv7t-mDkOyfO8B1fbJrXoCgKGKnVvhHE_V3Gcg5HK_AsRatIGTf6Dyd6G_
2,http://blog.csdn.net/yygydjkthh/article/details/7284302
阅读(1785) | 评论(0) | 转发(0) |