重读APUE(10)-中断的系统调用

如果进程在执行一个低速系统调用而阻塞期间捕获到一个信号,则该系统调用就会被中断而不再继续执行;该系统调用返回出错,其errno设置为EINTR;

系统将系统调用分成两类:低速系统调用和其他系统调用;低速系统调用是可能会使进程永远阻塞的一类系统调用,包括:

1. 如果某类型文件(如读管道,终端设备,网络设备等)的数据不存在,则读操作可能会使调用者永远阻塞;

2. 如果数据不能被相同类型的文件立即接受,则写操作可能会使调用者永远阻塞;

3. 在某种条件发生之前打开某些类型文件,可能会发生阻塞(如要打开一个终端设备,需要先等待与之连接的调制解调器应答);

4. pause函数和wait函数;

5. 某些ioctl操作;

6. 某些进程通信函数;

在编写代码的时候一个典型的实例如下:当read被信号打断的时候,即errno=EINTR,此时重新调用read继续读取数据;

1 again:
2 if ((n = read(fd, buf, BUFFSIZE)) < 0) {
3     if (errno == EINTR)
4         goto again; /* just an interrupted system call */
5     /* handle other errors */
6 }

猜你喜欢

转载自www.cnblogs.com/wanpengcoder/p/11762763.html