为什么exec()系列函数在exec()之后不执行代码?

Dr.*_*Pro 3 c system

手册页说"exec()系列函数用新的过程映像替换当前过程映像." 但我不太明白"用新的过程图像替换当前过程图像"的含义.例如,如果exec成功,则不会达到perror

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

pax*_*blo 5

正确.如果exec工作,perror将不会被调用,只是因为调用perror不再存在.

我发现在教育新手使用这些概念时,将UNIX执行模型视为由流程, 程序程序实例组成,有时会更容易.

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

程序实例是已加载到内存中并基本上正在运行的程序.虽然只有一个程序/bin/ls,但是如果你和我同时运行它,那么在任何给定的时间可能会有多个实例运行.

"加载到内存"这个短语是流程进入图片的地方.进程只是程序实例可以运行的"容器".

因此,当您fork进行流程时,您最终会得到两个不同的流程,但它们仍然会运行同一个程序的不同实例.该fork调用通常被称为一个进程调用但两个进程从中返回的调用.

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

成功exec调用中的丢弃是指示不会调用其后面的代码(perror在这种情况下).