как я могу получить возвращаемое значение программы, выполняемой exec?

У меня есть этот код c:

if(fork()==0){
  execl("/usr/bin/fsck", "fsck", "/dev/c0d0p1s0", NULL);
}

он вызывает execl для запуска fsck для проверки файловой системы /dev/c0d0p1s0.

Мой вопрос: как я могу получить возвращаемое значение fsck?

Мне нужно возвращаемое значение fsck, чтобы проверить, является ли файловая система последовательной или нет.

Спасибо.


person mnish    schedule 23.09.2010    source источник


Ответы (2)


Пусть родительский процесс дождется завершения дочернего процесса:

pid_t pid = fork();
if (pid == -1) {
  // error, no child created
}
else if (pid == 0) {
  // child
}
else {
  // parent
  int status;
  if (waitpid(pid, &status, 0) == -1) {
    // handle error
  }
  else {
    // child exit code in status
    // use WIFEXITED, WEXITSTATUS, etc. on status
  }
}
person Community    schedule 23.09.2010
comment
Да, кажется, я неправильно прочитал это! Я пытался указать; код возврата будет установлен в errno. Ну конечно, чтобы прочитать, что родительский код возврата должен дождаться ребенка :) ... В любом случае удалил ответ. - person KedarX; 23.09.2010
comment
@Роджер, спасибо. Я попробую и дам вам знать, что было в результате. - person mnish; 23.09.2010
comment
Следует отметить, что в конкретном случае вызова execl() в дочернем элементе вы также должны вызвать _exit() сразу после этого, чтобы предотвратить продолжение выполнения дочерним элементом в случае сбоя execl(). У вас также должен быть новый случай в родительском объекте, который обрабатывает возможную ошибку execl(). - person Blagovest Buyukliev; 23.09.2010
comment
@Blagovest: Разве вы уже не упоминали об этом в своем ответе? - person ; 23.09.2010
comment
@Roger Pate и @Blagovest: Спасибо, ребята, за вашу помощь, очень ценю ее. - person mnish; 23.09.2010

Вы должны вызвать wait() или waitpid() в родительском процессе, и это даст вам статус выхода программы, выполняемой execl(). Невызов одного из них приведет к тому, что дочерний процесс останется зомби после завершения, то есть процесс, который мертв, но остается в таблице процессов, потому что его родитель не интересовался своим кодом возврата.

#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

...

pid_t pid;
int status;

if ((pid = fork()) == 0) {
  /* the child process */
  execl(..., NULL);
  /* if execl() was successful, this won't be reached */
  _exit(127);
}

if (pid > 0) {
  /* the parent process calls waitpid() on the child */
  if (waitpid(pid, &status, 0) > 0) {
    if (WIFEXITED(status) && !WEXITSTATUS(status)) {
      /* the program terminated normally and executed successfully */
    } else if (WIFEXITED(status) && WEXITSTATUS(status)) {
      if (WEXITSTATUS(status) == 127) {
        /* execl() failed */
      } else {
        /* the program terminated normally, but returned a non-zero status */
        switch (WEXITSTATUS(status)) {
          /* handle each particular return code that the program can return */
        }
      }
    } else {
      /* the program didn't terminate normally */
    }
  } else {
    /* waitpid() failed */
  }
} else {
  /* failed to fork() */
}

Вызов _exit() в дочернем элементе предназначен для предотвращения продолжения выполнения в случае сбоя execl(). Его статус возврата (127) также необходим, чтобы отличить случай возможного execl() сбоя в родительском объекте.

person Community    schedule 23.09.2010