c - 为什么 exec() 函数族不执行 exec() 之后的代码?

标签 c system

手册页说“exec() 系列函数用新的过程镜像替换当前的过程镜像。”但我不太明白“用新过程图像替换当前过程图像”的含义。比如exec成功,perror就达不到

execl("/bin/ls", /* Remaining items sent to ls*/ "/bin/ls", ".", (char *) NULL);
perror("exec failed");

最佳答案

正确。如果 exec 有效,则不会调用 perror,因为对 perror 的调用不再存在。

我发现在向新手介绍这些概念时,有时更容易将 UNIX 执行模型视为由进程、 程序程序实例组成。

程序是可执行文件,例如 /bin/ls/sbin/fdisk(请注意,这不包括 bash或 Python 脚本,因为在那种情况下,实际的可执行文件将是 bashpython 解释器,而不是脚本)。

程序实例是已经加载到内存中并且基本处于运行状态的程序。虽然只有一个程序,如 /bin/ls,但在任何给定时间可能有多个它的实例在运行,例如,如果你和我同时运行它。

“加载到内存中”短语是进程出现的地方。进程只是程序实例可以在其中运行的“容器”。

因此,当您fork 一个进程时,您最终会得到两个不同 进程,但它们仍然分别运行相同 的不同实例> 程序。 fork 调用通常被称为一个进程调用但两个进程返回的调用。

同样,exec 不会对进程本身产生影响,但它丢弃该进程中的当前程序实例并启动所请求程序的新实例。

成功的 exec 调用中的这种丢弃决定了它后面的代码(在本例中为 perror)将不会被调用。

关于c - 为什么 exec() 函数族不执行 exec() 之后的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56500020/

相关文章:

windows - 任务计划程序中是否有 IP 地址更改通知触发器?

php - 如何在运行 PHP 的另一个 sys 命令时从系统命令获得响应?

Android 模拟器版本 16.0 持久性/系统/存储?

c - 从终端输入到C文件中

c - 使用 scanf 进行结构输入

C歧义问题

java - 如何永久禁用操作栏/导航栏/状态栏 android 4.2.2

java - 长数据类型计算——为什么Java比C++快很多

python - 是什么让 C 比 Python 更快?

c - char getenv(const char *name); 的参数是什么?