为什么exec()函数族不';是否在exec()之后执行代码?

为什么exec()函数族不';是否在exec()之后执行代码?,c,system,C,System,手册页上说“exec()函数族用新的进程映像替换当前进程映像。”但我不太理解“用新进程映像替换当前进程映像”的含义。例如,如果exec成功,将无法联系到perror execl("/bin/ls", /* Remaining items sent to ls*/ "/bin/ls", ".", (char *) NULL); perror("exec failed"); 这意味着您当前的流程将变成新流程,而不是以前的流程。你停止做你正在做的事情,开始做,真正的做,做其他的事情,而不是去改变这个

手册页上说“exec()函数族用新的进程映像替换当前进程映像。”但我不太理解“用新进程映像替换当前进程映像”的含义。例如,如果exec成功,将无法联系到perror

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

这意味着您当前的流程将变成新流程,而不是以前的流程。你停止做你正在做的事情,开始做,真正的做,做其他的事情,而不是去改变这个过程


但是,您当前的pid和环境不是启动一个全新的流程,而是成为新流程。这样,在执行exec之前,您就可以按照新流程所需的方式进行设置了。除非execl失败,否则不会调用perror。
exec
函数是在兼容POSIX的操作系统中启动新进程的手段(通常与
fork
调用结合使用)。也许举个例子会有所帮助。假设您的程序(称为programX)正在运行。然后它调用一个exec函数,就像上面的函数一样。programX将不再作为正在运行的进程存在。相反,ls将运行。它将具有与programX相同的精确PID,但在其他方面几乎是一个全新的过程。

正确。如果
exec
工作,则不会调用
perror
,这仅仅是因为对
perror
的调用不再存在

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

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

程序实例是已加载到内存中且基本上正在运行的程序。虽然只有一个类似于
/bin/ls
的程序,但在任何给定时间都可能有多个实例在运行,例如,如果您和我同时运行它

“装入内存”这句话就是进程进入画面的地方。进程只是程序实例可以在其中运行的“容器”

因此,当你用
fork
一个进程时,你会得到两个不同的进程,但它们仍然各自运行同一程序的不同实例。
fork
调用通常被称为一个进程调用而两个进程返回的调用

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


在一个成功的
exec
调用中,这个丢弃意味着它后面的代码(
peror
在本例中)将不会被调用。

我认为这意味着当调用exec时,您的程序终止,新程序运行