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 }
  • 相关阅读:
    Binary Tree Inorder Traversal
    Populating Next Right Pointers in Each Node
    Minimum Depth of Binary Tree
    Majority Element
    Excel Sheet Column Number
    Reverse Bits
    Happy Number
    House Robber
    Remove Linked List Elements
    Contains Duplicate
  • 原文地址:https://www.cnblogs.com/wanpengcoder/p/11762763.html
Copyright © 2011-2022 走看看