Chinaunix
标题:
请教一个alarm(0)的问题
[打印本页]
作者:
cir2633
时间:
2009-06-28 00:41
标题:
请教一个alarm(0)的问题
下面这段程序是书上写的,作用是若10S内有输入,程序正常返回,若没有输入,则进入sgig_alrm函数;
我不太理解那个alarm(0),按书上的理解,这个alarm(0)的意思是取消之前的alarm闹钟,不返回SIGALRM;
我是这样理解的 :这段代码先alarm(10);然后走完两个if语句,这用不了10秒吧 ?然后就到了alarm(0),取消了之前的alarm(10)
这段代码我的理解是否有问题 ?
#define MAXLINE 4096
int main(void)
{
int n;
char line[MAXLINE];
/*设定超时时限*/
alarm(10);
/*信号注册函数*/
if(signal(SIGALRM, sig_alrm) == SIG_ERR)
perror("signal");
if((n = read(STDIN_FILENO, line, MAXLINE)) < 0)
perror("read");
alarm(0);
write(STDOUT_FILENO, line, n);
exit(0);
}
static void sig_alrm(int signo)
{
printf("in here alarm\n");
}
复制代码
#############
我觉得应该这样修改,不对的地方请指正
#define MAXLINE 4096
int main(void)
{
int n;
char line[MAXLINE];
/*设定超时时限*/
alarm(10);
/*信号注册函数*/
if(signal(SIGALRM, sig_alrm) == SIG_ERR)
perror("signal");
if((n = read(STDIN_FILENO, line, MAXLINE)) < 0)
perror("read");
else
alarm(0); //read()的返回值大于0,则不需要返回SIGALRM信号,所以调用alarm(0)取消之前的alarm(10)
write(STDOUT_FILENO, line, n);
exit(0);
}
static void sig_alrm(int signo)
{
printf("in here alarm\n");
}
复制代码
作者:
gawk
时间:
2009-06-28 01:24
if((n = read(STDIN_FILENO, line, MAXLINE)) < 0)
应该这里会阻塞
作者:
aaaaa5aa
时间:
2009-06-28 08:44
标题:
回复 #2 gawk 的帖子
用个循环吧.
作者:
cir2633
时间:
2009-06-28 10:07
标题:
回复 #2 gawk 的帖子
read()处会阻塞 ?
是不是open 函数打开STDIN_FILENO的时候,不加O_NONBLOCK,就是阻塞打开的,
所以read的时候会阻塞
不知我理解的对不对
作者:
gawk
时间:
2009-06-28 10:41
你代码在上运行过没有?
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2