手册页说"exec()系列函数用新的过程映像替换当前过程映像." 但我不太明白"用新的过程图像替换当前过程图像"的含义.例如,如果exec成功,则不会达到perror
execl("/bin/ls", /* Remaining items sent to ls*/ "/bin/ls", ".", (char *) NULL);
perror("exec failed");
Run Code Online (Sandbox Code Playgroud)
正确.如果exec工作,perror将不会被调用,只是因为调用perror不再存在.
我发现在教育新手使用这些概念时,将UNIX执行模型视为由流程, 程序和程序实例组成,有时会更容易.
程序是可执行文件,如/bin/ls或/sbin/fdisk(请注意,这不包括类似的东西bash或Python脚本,因为在这种情况下,实际的可执行文件将是bash或python解释器,而不是脚本).
程序实例是已加载到内存中并基本上正在运行的程序.虽然只有一个程序/bin/ls,但是如果你和我同时运行它,那么在任何给定的时间可能会有多个实例运行.
"加载到内存"这个短语是流程进入图片的地方.进程只是程序实例可以运行的"容器".
因此,当您fork进行流程时,您最终会得到两个不同的流程,但它们仍然会运行同一个程序的不同实例.该fork调用通常被称为一个进程调用但两个进程从中返回的调用.
同样,exec它不会对进程本身产生影响,但会丢弃该进程中的当前程序实例并启动所请求程序的新实例.
成功exec调用中的丢弃是指示不会调用其后面的代码(perror在这种情况下).