亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

Chinaunix

標題: 【請教】read被中斷后的返回值 [打印本頁]

作者: zhanglistar    時間: 2011-07-08 22:11
標題: 【請教】read被中斷后的返回值
代碼如下:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <signal.h>
  4. #include <errno.h>

  5. #define MAXLINE 1024

  6. static void sig_alrm(int);

  7. int
  8. main(void)
  9. {
  10.     int     n;
  11.     char    line[MAXLINE];

  12.     if (signal(SIGALRM, sig_alrm) == SIG_ERR) {
  13.         printf("signal(SIGALRM) error\n");
  14.         exit(1);
  15.     }

  16.     alarm(10);
  17.     if ((n = read(fileno(stdin), line, MAXLINE)) < 0) {
  18.         printf("read error:%s\n", strerror(errno));
  19.         exit(0);
  20.     }
  21.     alarm(0);

  22.     write(fileno(stdout), line, n);
  23.     exit(0);
  24. }

  25. static void
  26. sig_alrm(int signo)
  27. {
  28.     printf("alrm\n");
  29.     /* nothing to do, just return to interrupt the read */
  30. }
復(fù)制代碼
什么都不輸入或者輸入幾個字符,等待alrm信號。
信號產(chǎn)生后,打印alrm,然后read繼續(xù)阻塞,沒有按照預(yù)期退出程序。
可是我看了read的man手冊,說read被信號打斷后會返回-1,
這里為什么沒有返回呢?
環(huán)境:2.6.38.8-32.fc15.i686 #1 SMP
作者: wenjianhn    時間: 2011-07-08 23:02
本帖最后由 wenjianhn 于 2011-07-08 23:03 編輯

read沒有被信號打斷,而是在內(nèi)核自動重新執(zhí)行

UNP 10.5 中斷的系統(tǒng)調(diào)用 page 244
深入理解linux內(nèi)核 系統(tǒng)調(diào)用的重新執(zhí)行 page 445

代碼中的EINTR是為了魯棒性
作者: sh19871122    時間: 2011-07-09 08:57
在Unix環(huán)境高級編程中,列出了哪些系統(tǒng)函數(shù)在中斷后能自啟動的,而read正好在里面,不知道這樣的描述對不對……
作者: zhanglistar    時間: 2011-07-09 11:05
回復(fù) 2# wenjianhn


   恩 了解了。

   read被中斷后,被內(nèi)核重啟了。 在fedora 上是這樣的。 在ubuntu上不是, 也就是說各個發(fā)行版實現(xiàn)不一樣。而且可以使用sigaction來指定被中斷的系統(tǒng)調(diào)用是否重啟。
作者: wenjianhn    時間: 2011-07-18 11:35
回復(fù) 4# zhanglistar


我的環(huán)境:   
DISTRIB_DESCRIPTION="Ubuntu 11.04"
2.6.38-10-generic

運行你的代碼,沒有被中斷




歡迎光臨 Chinaunix (http://www.72891.cn/) Powered by Discuz! X3.2