實例
程序中有一個讀低速設備的會阻塞的操作(見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參數.