我无法理解sigaction()结果

时间:2015-09-28 19:21:01

标签: linux unix signals system eof

#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函数?

1 个答案:

答案 0 :(得分:1)

fgetc()返回EOF如果文件位于文件末尾,则在尝试读取该字符时发生错误。在这种情况下,read()被信号中断是一个错误,而SA_RESTART sigaction()选项会阻止此错误。

要区分EOF和错误,请使用feof()ferror(),或测试变量errno。对于EOF案例,errno0,对于错误,EINTR为{0}。