调用 execv() 失败

标签 c linux

代码:

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. 执行所需的功能
  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!

关于调用 execv() 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56809245/

相关文章:

使用公式速度=距离/时间计算时间

c - 如何将字符指针传递给函数

清除数组

java - Ubuntu 中的良好 Java 实践

linux - FUSE:OpenVZ 容器中的环回设备

linux - 我应该为守护进程使用 C++ 还是脚本?

sql-server - dockerfile 如何将 SQL Server 公开为本地主机?

c - 如何在宾果游戏中避免 TLE?

linux - 如何将通配符参数传递给 bash 文件

c - haskell FFI : Calling FunPtrs