我很困惑这个 execvp() 在此示例函数中如何处理,该函数使用 fork() 克隆进程

I'm confused how this execvp() is handled in this sample function which uses fork() to clone a process

本文关键字:函数 处理 何处理 进程 fork execvp      更新时间:2023-10-16

我从一本名为"高级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 execvpn”);
    abort ();
    }
}

,但我感到困惑的是,如果成功执行ls,则未打印错误,但是如果失败,它会打印出在其后行中放置的错误。

我的问题此行fprintf (stderr, “an error occurred in execvpn”);是在execvp()函数之后的,并且预计将在执行execvp()完成后执行,但事实并非如此,并且仅当execvp()遇到错误时才执行。似乎spawn()成功执行execvp()后,CC_6似乎即将完成。我是对的吗?

您可以查看execvp的manpage,它说:

exec()函数族用 一个新的过程图像。

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

因此,如果您的程序能够达到错误消息打印输出,则execvp功能将失败。否则另一个程序开始执行。

您的程序将仍将运行的原因是fork命令,该命令创建了该过程映像的副本,因此您将拥有两个相同的进程运行,其中只能由您尝试执行的命令替换一个。这是由if子句if (child_pid != 0)实现的,因为fork命令将复制该过程并返回新的进程ID(PID)。如果将其设置为0(请参见man 3 fork),则其新子过程,如果其!= 0为父程。您的功能仅执行execvp,如果其子进程,父进程会遇到早期返回。