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等函数的阻塞

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值