调用execv()失败

调用execv()失败,c,linux,C,Linux,代码: I'm parent! My PID is 4543 and my child's PID is 4544. I'm child! My PID is 4544. static void child(){ char*args[]={/bin/echo”,“Hello World!”,NULL}; printf(“我是孩子!我的PID是%d.\n”,getpid()); fflush(stdout); execv(“/bin/echo”,args);/!! err(EXIT_FAILUR

代码:

I'm parent! My PID is 4543 and my child's PID is 4544.
I'm child! My PID is 4544.
static void child(){
char*args[]={/bin/echo”,“Hello World!”,NULL};
printf(“我是孩子!我的PID是%d.\n”,getpid());
fflush(stdout);
execv(“/bin/echo”,args);/!!
err(EXIT_FAILURE,“execv()失败”);
}
静态无效父项(uu pid_ut pid_uc){
printf(“我是家长!我的PID是%d,我孩子的PID是%d。\n”,getpid(),PID_c);
退出(退出成功);
}
int main(){
__pid_t ret;
ret=fork();
如果(ret==-1){
错误(退出失败,“fork()失败”);
}else if(ret==0){
child();
}否则{
父母(ret);
}
err(退出失败,“不应到达此处”);
}
结果:

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()
失败


问题是什么?

以下建议代码:

#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");
}
  • 干净地编译
  • 执行所需的功能
  • 正确地等待子进程完成
  • 包含所需头文件所需的
    #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");
    }
    

    我在您的输出中没有看到“execv()失败”。似乎未调用
    err()
    。为什么你认为execv会失败?什么是pid?在我将
    \uu pid\u t
    更改为正确的
    pid\u t
    后,POSIX fork返回pid\u tYour code为我工作。你在什么环境下运行这个?因为子进程是一个子进程,所以父进程在子进程完成之前返回调用方。例如,当我运行该程序时,我会在“我的下一个shell提示符”后看到“Hello World!”。如果您在某种IDE下运行此程序,则在父级完成后,子级的输出可能会丢失。您可以尝试在
    父级()中调用
    睡眠(10)
    (即,在调用
    printf
    exit
    之间)。父进程需要调用
    wait()
    waitpid()
    以等待子进程完成。首先退出的父进程是产生“僵尸”的众所周知的方法(虽然现代OSs实际上将子进程附加到
    init
    进程。实际上,父进程在发布的代码中首先退出,这导致子进程从未执行
    exec*()
    函数,并且……,`除了缺少的
    wait()
    语句,发布的代码也丢失了:
    #include#include#include#include#include#include
    您是否希望我们猜测您的代码实际包含哪些头文件?谢谢。
    等待(NULL)
    似乎很重要。@nblizz很可能是您的提示覆盖了hello world。。。