我很困惑这个 execvp() 在此示例函数中如何处理,该函数使用 fork() 克隆进程
I'm confused how this execvp() is handled in this sample function which uses fork() to clone a process
我从一本名为"高级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
,如果其子进程,父进程会遇到早期返回。
相关文章:
- 如何在信号处理程序和普通函数中对全局变量进行互斥读写操作
- 如何使用对C函数和类对象的外部调用来处理C++头文件
- std::string 构造函数如何处理固定大小的 char[]?
- 模板函数如何处理可能共享一个交集的多个类型名称?
- 如何编写具有相同名称的相同函数,该函数在C++中几乎以相似的方式处理不同的类参数?
- 为什么这个噪声函数不处理否定参数?
- 传递多处理.将对象值为 ctype 函数?
- 处理简单 cpp 类构造函数中的错误
- 使用返回对象的函数处理错误
- 如何处理没有默认构造函数但在另一个构造函数中构造的对象?
- 在双重继承的情况下如何处理非标准构造函数
- 处理类内的回调时,必须调用对非静态成员函数的引用
- 在线程函数中处理数据向量时进行线程竞速
- 某些 boost::asio 异步函数是否将处理程序连接到操作,以便处理程序被触发一次?
- 如何处理冲突的函数和变量名称?
- 如何在复杂的算法中处理goto函数?
- 如何让 atoi() 函数处理字符串
- 生产编译器如何在流控制上实现析构函数处理
- 使用 lambda 函数处理 C++ libsigc++ 信号
- 为数组创建c++ max函数:处理数组大小为0的情况的正确方法是什么?