Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ I';我不知道这个示例函数如何处理这个execvp(),它使用fork()克隆进程_C++_C_Linux_Exec_Fork - Fatal编程技术网

C++ I';我不知道这个示例函数如何处理这个execvp(),它使用fork()克隆进程

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()函数族将当前进程映像替换为 一

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

但我感到困惑的是,在成功执行
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 ();
    }
}