apue关于信号

xhy_851221 2009-02-26 06:00:05
程序一
int
main(void)
{
int n;
char line[MAXLINE];

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

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

write(STDOUT_FILENO, line, n);
exit(0);
}

static void
sig_alrm(int signo)
{
/* nothing to do, just return to interrupt the read */
}

程序二
static void sig_alrm(int);
static jmp_buf env_alrm;

int
main(void)
{
int n;
char line[MAXLINE];

if (signal(SIGALRM, sig_alrm) == SIG_ERR)
err_sys("signal(SIGALRM) error");
if (setjmp(env_alrm) != 0)
err_quit("read timeout");

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

write(STDOUT_FILENO, line, n);
exit(0);
}

static void
sig_alrm(int signo)
{
longjmp(env_alrm, 1);
}

我想问的是:
第一个程序如果系统调用是自动重启动的话,当从SIGALRM信号处理程序返回时,read并不被中断,也就是说设置时间限制不起作用。为什么第二个程序使用 longjmp就能解决该问题
期待大侠的回答
...全文
71 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
xhy_851221 2009-02-26
  • 打赏
  • 举报
回复
[Quote=引用楼主 xhy_851221 的帖子:]
程序一
int
main(void)
{
int n;
char line[MAXLINE];

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

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

write(STDOUT_FILENO, line, n);
exit(0);
}

static void
sig_alrm(int signo)
{
/* nothing to do, just return to interrupt the read */
}…

我得问题是:为什么第二个程序用longjmp就能解决第一个程序的问题
[/Quote]
jessiefn 2009-02-26
  • 打赏
  • 举报
回复
如果被中断的系统调用是自动重启的,read()是不会被终止的。

如果使用longjmp(),那么程序的执行将回到之前保存的一个点,那么read()调用就好像从未执行过一样。

23,217

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧