zoukankan      html  css  js  c++  java
  • 重读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 }
  • 相关阅读:
    精英程序员
    C语言(2)
    C语言练习
    C语言工具---Code::Blocks
    C语言(1)
    【udacity】机器学习-神经网络
    【udacity】机器学习-回归
    【udacity】机器学习-决策树
    【术语记录】机器学习
    python入门(九):目录操作
  • 原文地址:https://www.cnblogs.com/wanpengcoder/p/11762763.html
Copyright © 2011-2022 走看看