手册页说“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 脚本,因为在那种情况下,实际的可执行文件将是 bash
或 python
解释器,而不是脚本)。
程序实例是已经加载到内存中并且基本处于运行状态的程序。虽然只有一个程序,如 /bin/ls
,但在任何给定时间可能有多个它的实例在运行,例如,如果你和我同时运行它。
“加载到内存中”短语是进程出现的地方。进程只是程序实例可以在其中运行的“容器”。
因此,当您fork
一个进程时,您最终会得到两个不同 进程,但它们仍然分别运行相同 的不同实例> 程序。 fork
调用通常被称为一个进程调用但两个进程返回的调用。
同样,exec
不会对进程本身产生影响,但它会丢弃该进程中的当前程序实例并启动所请求程序的新实例。
成功的 exec
调用中的这种丢弃决定了它后面的代码(在本例中为 perror
)将不会被调用。
关于c - 为什么 exec() 函数族不执行 exec() 之后的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56500020/