#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>
void handler(int sig)
{
pid_t pid;
int status;
while( (pid = waitpid(-1, &status, WNOHANG)) > 0 )
printf("%d\n", pid);
}
int main(void)
{
struct sigaction act;
pid_t pid;
int ch;
act.sa_handler = handler;
sigemptyset(&act.sa_mask);
act.sa_flags = 0;
sigaction(SIGCHLD, &act, 0);
pid = fork();
if( pid == 0 ) {
exit(0);
}
else {
if( (ch = fgetc(stdin)) == EOF )
printf("EOF\n");
}
}
您好,我想知道sigaction函数。如果我执行此程序,结果如下所示。
[process id]
EOF
为什么在处理SIGCHLD信号后EOF处于stdin缓冲区?我不知道为什么会这样。或者我可能不知道如何使用sigaction函数?
答案 0 :(得分:1)
fgetc()
返回EOF
如果文件位于文件末尾或,则在尝试读取该字符时发生错误。在这种情况下,read()
被信号中断是一个错误,而SA_RESTART
sigaction()
选项会阻止此错误。
要区分EOF和错误,请使用feof()
或ferror()
,或测试变量errno
。对于EOF案例,errno
为0
,对于错误,EINTR
为{0}。