如果进程在执行一个低速系统调用而阻塞期间捕获到一个信号,则该系统调用就会被中断而不再继续执行;该系统调用返回出错,其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 }

 

相关文章:

  • 2022-12-23
  • 2021-06-30
  • 2021-11-30
  • 2021-12-02
  • 2022-12-23
  • 2022-12-23
  • 2021-07-13
  • 2021-11-16
猜你喜欢
  • 2022-12-23
  • 2021-06-21
  • 2022-02-13
  • 2021-09-19
  • 2022-01-07
  • 2022-02-01
  • 2021-12-05
相关资源
相似解决方案