我的问题是:在完成新过程映像的执行后,函数
EXECL()
会将执行返回给调用者进程还是父进程?
答案 0 :(得分:2)
使用其中一个exec
系列函数时,根本不希望该函数返回。程序计数器从替换调用进程的二进制映像的第一条指令开始。
来自Darwin手册页:
如果任何exec()函数返回,则会发生错误。 返回值为-1,全局变量errno将设置为 表明错误。
有评论询问以下内容,但已被删除:
如果您处于子进程中,并且execl
成功,则子进程将被新二进制文件替换。如果失败,则控制返回到该子进程(调用者)。 fork
和exec
之间没有严格的关系,如果这就是您要问的问题。如果您处于子进程中,并且exec
失败,那么您有一个"分叉"子进程,它是原始父进程的副本。此时,您可能希望打印一些错误消息并退出子进程。
如果您想知道为什么失败,您可以使用以下模式:
if (execl(...)) {
perror(NULL);
exit(errno);
}
例如,尝试运行此程序,错误消息将指示如何修复程序:
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main (const int argc, char * const argv[]) {
if (execl("ls", "ls", "-la", NULL)) {
perror(NULL);
exit(errno);
}
return 0;
}
解决方案,在这种情况下使用execlp
代替execl
。