Как я могу получить возвращаемое значение execv? - PullRequest
1 голос
/ 28 марта 2012

Я действительно новичок в C ++ и пытаюсь получить вывод:

execv("./rdesktop",NULL);

Я программирую на C ++ и на RHEL 6.

Как FTP-клиент, яхотел бы получить все обновления статуса из моей внешней работающей программы.Может кто-нибудь сказать, пожалуйста, как я мог это сделать?

Ответы [ 2 ]

4 голосов
/ 28 марта 2012

execv заменяет текущий процесс, поэтому сразу после его выполнения будет выполняться любой исполняемый файл, который вы указали.

Обычно вы делаете fork, а затем execv только в дочернем процессе. Родительский процесс получает PID нового дочернего элемента, который он может использовать для контроля выполнения дочернего элемента.

1 голос
/ 28 марта 2012

Вы можете проверить состояние выхода дочернего процесса, вызвав wait, waitpid, wait3 или wait4.

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

int main () {
  pid_t pid = fork();
  switch(pid) {
  case 0:
    // We are the child process
    execl("/bin/ls", "ls", NULL);

    // If we get here, something is wrong.
    perror("/bin/ls");
    exit(255);
  default:
    // We are the parent process
    {
      int status;
      if( waitpid(pid, &status, 0) < 0 ) {
        perror("wait");
        exit(254);
      }
      if(WIFEXITED(status)) {
        printf("Process %d returned %d\n", pid, WEXITSTATUS(status));
        exit(WEXITSTATUS(status));
      }
      if(WIFSIGNALED(status)) {
        printf("Process %d killed: signal %d%s\n",
          pid, WTERMSIG(status),
          WCOREDUMP(status) ? " - core dumped" : "");
        exit(1);
      }
    }
  case -1:
    // fork failed
    perror("fork");
    exit(1);
  }
}
...