手册页说“exec()系列函数用新的过程映像替换当前过程映像。”但我不太明白“用新的过程图像替换当前过程图像”的含义。例如,如果exec成功,则不会达到perror
execl("/bin/ls", /* Remaining items sent to ls*/ "/bin/ls", ".", (char *) NULL);
perror("exec failed");
答案 0 :(得分:5)
正确。如果exec
有效,则不会调用perror
,只是因为对perror
的调用不再存在。
我发现在教育这些概念的新手时,将UNIX执行模型视为由进程, 程序和程序实例组成,有时会更容易。
程序是可执行文件,例如/bin/ls
或/sbin/fdisk
(请注意,这不包括bash
或Python脚本之类的内容,因为在这种情况下,实际的可执行文件将是bash
或python
解释器,而不是脚本。)
程序实例是已加载到内存中并基本上正在运行的程序。虽然只有一个程序如/bin/ls
,但如果你和我同时运行它,那么在任何给定时间可能会有多个实例运行。
“加载到内存”这个短语就是流程进入图片的地方。进程只是程序实例可以运行的“容器”。
因此,当您fork
进程时,您最终会得到两个不同的进程,但它们仍然会运行相同程序的不同实例。 fork
调用通常被称为一个进程调用但从两个进程返回的调用。
同样,exec
不会对进程本身产生影响,但将丢弃该进程中的当前程序实例并启动所请求程序的新实例。
成功exec
调用中的丢弃是指示后面的代码(在这种情况下为perror
)将不会被调用。
答案 1 :(得分:0)
这意味着您当前的流程将成为新流程而非流程。你停止做你正在做的事情并开始做,真正的存在,而不是其他事情,永远不会重新成为曾经的过程。
然而,不是开始一个全新的过程,而是当前的pid和环境成为新的过程。这让你在执行exec之前按照新进程需要的方式设置东西答案 2 :(得分:0)
你是对的。除非execl失败,否则不会调用perror。 exec
函数是在符合POSIX的操作系统中启动新进程的方法(通常与fork
调用结合使用)。也许一个例子会有所帮助。假设您的程序(称为programX)正在运行。然后它调用一个exec函数,就像你上面的那个。 programX将不再作为正在运行的进程存在。相反,ls将会运行。它将具有与programX完全相同的PID,但在其他方面几乎是一个全新的过程。