gpt4 book ai didi

c++ - 我很困惑如何在这个使用 fork() 克隆进程的示例函数中处理这个 execvp()

转载 作者:太空宇宙 更新时间:2023-11-04 08:26:40 24 4
gpt4 key购买 nike

我从一本名为“高级 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() 后立即完成。我说得对吗?

最佳答案

您可以查看 execvp 的联机帮助页,它说:

The exec() family of functions replaces the current process image with a new process image.

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

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

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

关于c++ - 我很困惑如何在这个使用 fork() 克隆进程的示例函数中处理这个 execvp(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30182804/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com