apue读书笔记:实例10-10 带时间限制调用read

实例

程序中有一个读低速设备的会阻塞的操作(见10.5节),我们希望它超过一定时间后就停止执行该操作。程序实现了这一点,它从标准输入读一行,然后将其写到标准输出上。

#include "apue.h"

static void     sig_alrm(int);

int
main(void)
{
        int             n;  
        char    line[MAXLINE];

        if (signal(SIGALRM, sig_alrm) == SIG_ERR)
                err_sys("signal(SIGALRM) error");

        alarm(10);
        if ((n = read(STDIN_FILENO, line, MAXLINE)) < 0)
                err_sys("read error");
        alarm(0);

        write(STDOUT_FILENO, line, n); 
        exit(0);
}

static void
sig_alrm(int signo)
{
        /* nothing to do, just return to interrupt the read */
}

在这里插入图片描述

FAQ

alarm函数,在其中什么作用?为何能达到解阻塞作用?

需要关注<10.5 中断的系统调用>章节,

早期UNIX系统的一个特性是:如果在进程执行一个低速系统调用而阻塞期间捕捉到一个信号,则该系统调用就被中断不再继续执行。

后期的UNIX系统引进了某些被中断的系统调用的自动再起动.自动重起动的系统调用包括:ioctl,read,readv,write,writev,wait,waitpid.

  • alarm函数作用:到时见发SIGALRM信号,
  • 信号发生,中断了阻塞操作.

自己手敲代码,自行编译链接.(非官方源码环境)但与原书的效果不一致.

关注:

1.操作系统版本
2.makefile参数.

如文章:
linux alarm函数解除read write等函数的阻塞

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章