实例
程序中有一个读低速设备的会阻塞的操作(见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参数.