【问题标题】:I'm confused how this execvp() is handled in this sample function which uses fork() to clone a process我很困惑这个 execvp() 在这个使用 fork() 克隆进程的示例函数中是如何处理的
【发布时间】:2015-05-12 05:53:09
【问题描述】:

我从一本名为“高级 Linux 编程”的书中获得了以下功能。

int spawn (char* program, char** arg_list)
{
    pid_t child_pid;

    /* Duplicate this process. */
    child_pid = fork ();

    if (child_pid != 0)
    /* This is the parent process. */
    return child_pid;

    else {
    /* Now execute PROGRAM, searching for it in the path. */
    execvp (program, arg_list);

    /* The execvp function returns only if an error occurs. */
    fprintf (stderr, “an error occurred in execvp\n”);
    abort ();
    }
}

但我很困惑,在ls 成功执行的情况下,不会打印错误,但如果失败,它会打印错误,并将其放在它后面的行中。

我的问题 fprintf (stderr, “an error occurred in execvp\n”);这一行在execvp()函数之后,预计会在execvp()执行完毕后执行,但事实并非如此,只有在execvp()遇到错误时才会执行。似乎函数spawn() 在成功执行execvp() 后立即结束。我说的对吗?

【问题讨论】:

    标签: c++ c linux exec fork


    【解决方案1】:

    您可以查看execvp 的手册页,上面写着:

    exec() 系列函数将当前进程映像替换为 一个新的过程映像。

    那么,这是什么意思?这意味着,如果execvp 成功,您的程序将不再在内存中,因此它永远不会到达错误消息。您在内存中的程序将被新程序替换(在您的情况下为ls,如果我理解正确的话)。

    因此,如果您的程序能够打印出错误消息,那么execvp 函数将失败。否则其他程序开始执行。

    您的程序仍在运行的原因是fork 命令,该命令会创建进程映像的副本,因此您将运行两个相同的进程,其中只有一个会被您尝试执行的命令替换执行。这是通过if 子句if (child_pid != 0) 实现的,因为fork 命令将复制进程并返回新的进程ID (PID)。如果设置为0(参见man 3 fork),那么它是新的子进程,如果它的!= 0 是父进程。你的函数只有在子进程遇到父进程提前返回时才会执行execvp

    【讨论】:

    • 感谢您的解释。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-13
    • 1970-01-01
    • 2012-11-16
    • 1970-01-01
    • 1970-01-01
    • 2017-05-10
    相关资源
    最近更新 更多