一个简单的程序示例
奇怪的是,安装信号处理程序会使getchar
每当孩子退出时都返回EOF。相当有害的副作用。
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
void handler() {
//
}
void action() {
if (fork() == 0) {
printf("(action)\n");
sleep(1);
exit(0);
}
}
int main(int argc, char** argv) {
char c;
signal(SIGCHLD, handler); // signal
while (EOF != (c = getchar())) {
if (c == 'a') action();
}
printf("End Of Data\n");
}
注释掉信号ligne后,问题消失了。 有人可以解释为什么会这样吗?
似乎与Handling SIGCHLD will return EOF to the father, why?相同的问题 关于为什么以及如何避免这种情况尚无明确答案。
编辑1:对我来说不清楚(星期五晚上...)
getchar()
下的系统调用被中断,导致它返回EOF
(如手册页中所述)。errno
中是否有EINTR
。在此示例中
while (EOF != (c = getchar()) || errno == EINTR) {
编辑2:检查errno
适用于getchar()
,但不能使您getline()
步步高升。
真正的解决方案是忘记过时的signal()
,而将sigaction()
与SA_RESTART
标志一起使用。