C++ I';我不知道这个示例函数如何处理这个execvp(),它使用fork()克隆进程
我从一本名为“高级Linux编程”的书中获得了以下函数 但我感到困惑的是,在成功执行C++ I';我不知道这个示例函数如何处理这个execvp(),它使用fork()克隆进程,c++,c,linux,exec,fork,C++,C,Linux,Exec,Fork,我从一本名为“高级Linux编程”的书中获得了以下函数 但我感到困惑的是,在成功执行ls的情况下,不会打印错误,但如果失败,它会打印错误,并将其放在后面的行中 我的问题 此行fprintf(stderr,“execvp中发生错误”)在execvp()函数之后,预计将在execvp()执行完成后执行,但情况并非如此,仅当execvp()遇到错误时才会执行。函数spawn()似乎在成功执行execvp()后立即完成。我说的对吗?您可以查看手册页,上面写着: exec()函数族将当前进程映像替换为 一
ls
的情况下,不会打印错误,但如果失败,它会打印错误,并将其放在后面的行中
我的问题
此行
fprintf(stderr,“execvp中发生错误”)
在execvp()
函数之后,预计将在execvp()
执行完成后执行,但情况并非如此,仅当execvp()
遇到错误时才会执行。函数spawn()
似乎在成功执行execvp()
后立即完成。我说的对吗?您可以查看手册页,上面写着:
exec()函数族将当前进程映像替换为
一个新的进程映像
那么,这意味着什么?这意味着,如果execvp
成功,您的程序将不再在内存中,因此它永远不会到达错误消息。内存中的程序将被新程序替换(在您的情况下,如果我理解正确,ls
)
因此,如果您的程序能够到达错误消息打印输出,则execvp
函数将失败。否则,另一个程序开始执行
程序仍在运行的原因是
fork
命令,它创建了进程映像的副本,因此您将有两个相同的进程运行,其中只有一个进程将被您尝试执行的命令替换。这是通过if
子句if(child_pid!=0)
实现的,因为fork
命令将复制进程并返回新的进程ID(pid
)。如果将其设置为0
(请参阅),则它是新的子进程,如果它的!=0
它是父进程。您在那里的函数仅执行execvp
如果它是子进程,则父进程会遇到提前返回。谢谢您的解释。
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 ();
}
}