+ -
当前位置:首页 → 问答吧 → 关于alarm以及SIGALRM信号

关于alarm以及SIGALRM信号

时间:2010-09-08

来源:互联网

APUE中有如下程序
  1. #include "apue.h"

  2. static void     sig_alrm(int);

  3. int
  4. main(void)
  5. {
  6.         int             n;
  7.         char    line[MAXLINE];

  8.         if (signal(SIGALRM, sig_alrm) == SIG_ERR)
  9.                 err_sys("signal(SIGALRM) error");

  10.         alarm(10);
  11.         if ((n = read(STDIN_FILENO, line, MAXLINE)) < 0)
  12.                 err_sys("read error");
  13.         alarm(0);

  14.         write(STDOUT_FILENO, line, n);
  15.         exit(0);
  16. }

  17. static void
  18. sig_alrm(int signo)
  19. {
  20.         /* nothing to do, just return to interrupt the read */
  21. }
复制代码
我很困惑:这段程序中,为什么说当alarm到了后,signal函数调用完sig_alrm函数返回了之后,read也终止了?
我自己在CentOS上测试,结果是read并没有终止,从sig_alrm返回后,read仍然处于读状态,直到读到回车为止。
书里面说很多Unix应用程序都有这一段,用来设置一个能够被block的进程的上限时间,当超过这个时间后,这个被block的进程就会被终止了~
我在考虑除非在sig_alrm中exit,不然的话它是不会终止的,为什么注释部分却说"nothing to do, just return to interrupt the read",事实上,read并没有被interrept,我测试了的。
而且我添加exit到sig_alrm函数后,发现即使exit了,结果write还是执行了,这个是因为缓存的原因吧?为什么进程结束了,标准输入读入的数据还是输出了?是因为exit本身就会先执行清理再调用_exit函数退出,对吧,请高人指点迷津,再次谢过!

作者: blackgenius   发布时间: 2010-09-08

系统实现不一样啦,有的系统read这样的系统调用会被信号中止,有的会自动重启,LINUX属于后一种。要想实现LINUX下中止的效果,可以用sigaction安装信号处理函数,并设置sa_flags中的项让系统调用不自动重启,详见APUE2中文版第262-263的说明和265最下边的示例程序。

作者: liwangli1983   发布时间: 2010-09-08

回复 liwangli1983

高人呐!看过那一段了,只是忘记了~呵呵!谢谢指点,你有APUE第二版的中文版电子版么?有的话给我发一份好么?[email protected],再次感谢啊!

作者: blackgenius   发布时间: 2010-09-08



QUOTE:
回复  liwangli1983

高人呐!看过那一段了,只是忘记了~呵呵!谢谢指点,你有APUE第二版的中文版电子版 ...
blackgenius 发表于 2010-09-08 20:51




    。。。我有书,刚才现翻的。。。要不然上哪记得那么清楚。这么经典的书最好还是买一本,就算嫌正版贵去淘宝收本便宜的也行啊

作者: liwangli1983   发布时间: 2010-09-08

回复 liwangli1983
呵呵~那倒是,只可惜我目前工作没有稳定下来,东跑西跑,带着那么大一本东西挺重的,英文版的看到线程那里开始晕了~一开始没看懂,所以想有本中文的对着看~过段时间稳定下来一定去买一本来!

作者: blackgenius   发布时间: 2010-09-08

相关阅读 更多

热门下载

更多