Неправильный статус при использовании waitpid с WHOHANG - PullRequest
0 голосов
/ 23 ноября 2010

Я хочу знать, когда мой дочерний процесс завершается.Но я не хочу блокировать свое приложение, поэтому я использую WNOHANG.

#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void handler(int nsig) {
  int status;
  waitpid(-1, &status, WNOHANG);
  printf("nsig=%i; status=%i\n", nsig, status);
  if (WIFEXITED(status)) {
    printf("Exited\n");
  }
}

int main() {  
  struct sigaction act;
  act.sa_handler = handler;
  if (sigaction(SIGCHLD, &act, 0) < 0) {
    fprintf(stderr, "sigaction failed\n");
    exit(-1);
  }

  pid_t fpid;
  fpid = fork();
  if (fpid == 0) {
    execlp("okular", "okular", 0);
  }
  while(1);
  return 0;
}

Это прекрасно работает, если я закрою "okular" как обычно.

$ ./test
nsig=17; status=0
Exited

Но если я это сделаючто-то вроде

kill -STOP OKULAR_PID

У меня такой же вывод, и это неправильно для меня, потому что на самом деле окуляр не выходил.

1 Ответ

1 голос
/ 23 ноября 2010

Я думаю, что это правильно, потому что SIGCHLD определен как дочерний прерывается или останавливается, как можно видеть на этой справочной странице для сигнала.SIGCLD является синонимом SIGCHLD.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...