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

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