Вызов execv () не удался - PullRequest
       1

Вызов execv () не удался

2 голосов
/ 28 июня 2019

Код:

static void child() {
    char* args[] = {"/bin/echo", "Hello World!", NULL};
    printf("I'm child! My PID is %d.\n", getpid());
    fflush(stdout);
    execv("/bin/echo", args); // !!
    err(EXIT_FAILURE, "execv() failed");
}

static void parent(__pid_t pid_c) {
    printf("I'm parent! My PID is %d and my child's PID is %d.\n", getpid(), pid_c);
    exit(EXIT_SUCCESS);
}

int main() {
    __pid_t ret;
    ret = fork();

    if (ret == -1) {
        err(EXIT_FAILURE, "fork() failed");
    } else if (ret == 0) {
        child();
    } else {
        parent(ret);
    }

    err(EXIT_FAILURE, "Shouldn't reach here");
}

Результат:

I'm parent! My PID is 4543 and my child's PID is 4544.
I'm child! My PID is 4544.

В приведенном выше коде я хочу заменить процесс child на процесс /bin/echo, но echo не работает. Точнее, вызов execv() не удался.

В чем проблема?

1 Ответ

2 голосов
/ 28 июня 2019

Следующий предложенный код:

  1. безупречной компиляции
  2. выполняет желаемую функциональность
  3. должным образом ожидает завершения дочернего процесса
  4. содержитнеобходимые #include операторы для необходимых заголовочных файлов

и теперь предлагаемый код:

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

static void child() {
    char* args[] = {"/bin/echo", "Hello World!", NULL};
    printf("I'm child! My PID is %d.\n", getpid());
    fflush(stdout);
    execv( args[0], args); 
    err(EXIT_FAILURE, "execv() failed");
}

static void parent(__pid_t pid_c) {
    printf("I'm parent! My PID is %d and my child's PID is %d.\n", getpid(), pid_c);
    wait( NULL );
    exit(EXIT_SUCCESS);
}

int main() {
    __pid_t ret;
    ret = fork();

    if (ret == -1) {
        err(EXIT_FAILURE, "fork() failed");
    } else if (ret == 0) {
        child();
    } else {
        parent(ret);
    }

    err(EXIT_FAILURE, "Shouldn't reach here");
}

результирующий вывод:

I'm parent! My PID is 31293 and my child's PID is 31294.
I'm child! My PID is 31294.
Hello World!
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...