【发布时间】:2021-04-20 20:12:16
【问题描述】:
我发现了一个问题,它要求解释以下程序的行为:
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
void sig_alrm(int n) {
write(2, "ALARM!\n", 7);
return;
}
int main() {
int fd[2], n;
char message[6], *s;
s = "HELLO\n";
signal(SIGALRM, sig_alrm);
pipe(fd);
if (fork() == 0) {
close(fd[1]);
alarm(3);
while ((n = read(fd[0], message, 6)) > 0);
alarm(0);
exit(0);
}
close(1);
dup(fd[1]);
close(fd[0]);
close(fd[1]);
while (1)
write(1, s, 6);
}
它基本上是一个带有共享管道的父进程,它通过管道不断地向子进程发送 HELLO\n。孩子在三秒内设置了一个SIGALRM,它将被 sig_alrm 函数捕获,然后继续从管道中无限期地读取。
如果我理解正确,SIGALRM 应该中断read() 系统调用,导致它在到达时出错,这反过来会导致子进程以默认行为的即时警报退出,而父进程结束也是因为SIGPIPE。
问题是我试图运行代码,在SIGALRM 到达子进程后,两个进程继续愉快地从管道中读写。
我对信号行为有什么误解吗?
【问题讨论】:
-
可能它没有在读取中休眠,因为写入速度更快,并且总有一些东西要读取。尝试减慢写入速度。
-
@dratenik 谢谢,但没有运气。我试着每隔一秒或几秒写一次,同样的事情发生了。
-
我敢打赌你的操作系统的
signal()实现会安装一个可重启的处理程序。请改用sigaction()。
标签: c signals system-calls