亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区
Chinaunix
標題:
【請教】read被中斷后的返回值
[打印本頁]
作者:
zhanglistar
時間:
2011-07-08 22:11
標題:
【請教】read被中斷后的返回值
代碼如下:
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <errno.h>
#define MAXLINE 1024
static void sig_alrm(int);
int
main(void)
{
int n;
char line[MAXLINE];
if (signal(SIGALRM, sig_alrm) == SIG_ERR) {
printf("signal(SIGALRM) error\n");
exit(1);
}
alarm(10);
if ((n = read(fileno(stdin), line, MAXLINE)) < 0) {
printf("read error:%s\n", strerror(errno));
exit(0);
}
alarm(0);
write(fileno(stdout), line, n);
exit(0);
}
static void
sig_alrm(int signo)
{
printf("alrm\n");
/* nothing to do, just return to interrupt the read */
}
復(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