为什么 exec() 函数族不执行 exec() 之后的代码?
why the exec() family of functions doesn't execute the code after exec()?
手册页说 "The exec() family of functions replaces the current process image with a new process image." 但我不太明白 "replaces the current process image with a new process image" 的意思。比如exec成功了,perror就达不到了
execl("/bin/ls", /* Remaining items sent to ls*/ "/bin/ls", ".", (char *) NULL);
perror("exec failed");
这意味着您当前的进程变成了新进程,而不是原来的进程。你停止做你正在做的事情,开始做,真正成为别的东西,而不是重新成为那个过程曾经的样子。
但是,您当前的 pid 和环境将成为新进程,而不是启动一个全新的进程。让我们在执行 exec
之前按照新进程需要的方式进行设置
你是对的。除非 execl 失败,否则不会调用 perror。 exec
函数是在 POSIX 兼容 OS 中启动新进程的方法(通常与 fork
调用相结合)。也许一个例子会有所帮助。假设您的程序(称为 programX)是 运行。然后它调用一个 exec 函数,就像上面的函数一样。 programX 将不再作为 运行 进程存在。相反,ls 将是 运行。它将具有与 programX 完全相同的 PID,但除此之外几乎是一个全新的进程。
正确。如果 exec
有效,则不会调用 perror
,因为对 perror
的调用不再存在。
我发现有时在向新手介绍这些概念时更容易将 UNIX 执行模型视为由 进程、 程序 和 程序实例。
程序是可执行文件,例如 /bin/ls
或 /sbin/fdisk
(请注意,这不包括 bash
或 Python 脚本,因为在那种情况下,实际的可执行文件是 bash
或 python
解释器,而不是脚本)。
程序实例是已经加载到内存中的程序,基本上是运行ning。虽然只有一个像 /bin/ls
这样的程序,但在任何给定时间可能会有多个 运行ning 实例,例如,如果你和我同时 运行 它。
"loaded into memory" 短语是进程发挥作用的地方。进程只是 "containers",其中程序实例可以 运行.
所以,当你 fork
一个进程时,你最终会得到两个 distinct 个进程,但它们仍然是每个 运行ning 的不同实例相同 程序。 fork
调用通常被称为一个进程调用但两个进程 return 来自的调用。
同样,exec
不会对进程本身产生影响,但它会丢弃该进程中的当前程序实例并启动请求的新实例程序。
成功的 exec
调用中的这种丢弃决定了它后面的代码(在本例中为 perror
)将不会被调用。
手册页说 "The exec() family of functions replaces the current process image with a new process image." 但我不太明白 "replaces the current process image with a new process image" 的意思。比如exec成功了,perror就达不到了
execl("/bin/ls", /* Remaining items sent to ls*/ "/bin/ls", ".", (char *) NULL);
perror("exec failed");
这意味着您当前的进程变成了新进程,而不是原来的进程。你停止做你正在做的事情,开始做,真正成为别的东西,而不是重新成为那个过程曾经的样子。
但是,您当前的 pid 和环境将成为新进程,而不是启动一个全新的进程。让我们在执行 exec
之前按照新进程需要的方式进行设置你是对的。除非 execl 失败,否则不会调用 perror。 exec
函数是在 POSIX 兼容 OS 中启动新进程的方法(通常与 fork
调用相结合)。也许一个例子会有所帮助。假设您的程序(称为 programX)是 运行。然后它调用一个 exec 函数,就像上面的函数一样。 programX 将不再作为 运行 进程存在。相反,ls 将是 运行。它将具有与 programX 完全相同的 PID,但除此之外几乎是一个全新的进程。
正确。如果 exec
有效,则不会调用 perror
,因为对 perror
的调用不再存在。
我发现有时在向新手介绍这些概念时更容易将 UNIX 执行模型视为由 进程、 程序 和 程序实例。
程序是可执行文件,例如 /bin/ls
或 /sbin/fdisk
(请注意,这不包括 bash
或 Python 脚本,因为在那种情况下,实际的可执行文件是 bash
或 python
解释器,而不是脚本)。
程序实例是已经加载到内存中的程序,基本上是运行ning。虽然只有一个像 /bin/ls
这样的程序,但在任何给定时间可能会有多个 运行ning 实例,例如,如果你和我同时 运行 它。
"loaded into memory" 短语是进程发挥作用的地方。进程只是 "containers",其中程序实例可以 运行.
所以,当你 fork
一个进程时,你最终会得到两个 distinct 个进程,但它们仍然是每个 运行ning 的不同实例相同 程序。 fork
调用通常被称为一个进程调用但两个进程 return 来自的调用。
同样,exec
不会对进程本身产生影响,但它会丢弃该进程中的当前程序实例并启动请求的新实例程序。
成功的 exec
调用中的这种丢弃决定了它后面的代码(在本例中为 perror
)将不会被调用。