如果execvp()成功,子进程会发生什么?

时间:2018-02-10 03:20:44

标签: c

我有一个关于使用execvp()的问题,对于以下函数,如果我在子进程中并且execvp()函数执行成功(根据手册页,它将不会返回),如果else {}之外的脚本将继续工作,这意味着如果execCmd()函数将返回任何值?

int execCmd(char* args[10]) {
    pid_t pid = fork();
    if (pid < 0) {
        exit(1);
    } else if (pid > 0) { // parent process
        /* do something */
    } else {
        if (execvp(*args, args) < 0) {
            printf("Execution Failed!"); 
            exit(1);
        }
    }
    return 0;
}

提前致谢!

2 个答案:

答案 0 :(得分:1)

如果execvp成功,则该过程开始执行指定的程序。

Parent Process          Child Process
-------------------     -------------------
fork()
pid_t pid = ...;        pid_t pid = ...;
pid < 0                 pid < 0
pid > 0                 pid > 0
/* do something */      execvp(*args, args)
return 0;               [main of new program]

你的程序本可以写成

int execCmd(char** args) {
    pid_t pid = fork();
    if (pid < 0) {
        perror("fork");
        exit(1);
    }

    if (pid == 0) {
        execvp(*args, args);
        perror("execvp");
        _exit(1);
    }

    /* ... Do something in parent ... */
    return 0;
}

此外,您可能希望等待孩子完成,返回pid或让孩子自动收割(通过忽略SIGCHILD)。

答案 1 :(得分:0)

一般来说,代码不应该执行misc语句;

代码应该只需要测试一次fork()的调用结果。

请注意,无需在execvp()代码块中将调用包装到if()

父进程应该在退出之前等待子进程完成。

发生错误时,应通过调用stderrfprintf( stderr, "...\n" )输出错误消息但是,当错误来自系统函数时,系统认为发生错误的原因也应该是输出到stderr。实现此目的的一种简单方法是调用perror()

为了便于阅读和理解:单独的代码块(for if else while do...while switch case { {1}})通过一个空白行。

调用default的首选代码逻辑是:

fork()