首页 > 技术文章 > linux alarm函数解除read write等函数的阻塞

thammer 2015-12-02 17:08 原文

  看到apue的第十章,说到alarm,pause可以实现sleep,可以让某些一直阻塞的函数超时,例如read,write。代码如下:

 1 static void sig_alrm(int signo)
 2 {
 3     printf("I'm just print from sig_alrm\n");
 4 }
 5 
 6 int main ( int argc, char *argv[] )
 7 {
 8     int n;
 9     char buf[32];
10 
11     if ( signal(SIGALRM, sig_alrm) == SIG_ERR )
12     {
13         perror("signal");
14         exit (1);
15     }
16     
17     alarm(3);
18     if ( (n = read(STDIN_FILENO, buf, 32)) < 0 )
19     {
20         perror("read");
21     }
22     alarm(0);
23     write(STDOUT_FILENO,buf, n);
24     return 0;
25 }

 编译运行,发现并没有效果,程序依然卡在read处,但是随书源码却可以,经过对比发现,是编译参数不同,我的例子是默认的,但是书上使用了-ansi这个参数进行编译,使用这个参数编译我的代码,就起到了效果,原因暂时不明,也没查到,猜想是-ansi标准的read函数阻塞可被信号中断。

 

推荐阅读