我从一本名为"高级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
,如果其子进程,父进程会遇到早期返回。