execl返回-Ubuntu

execl返回-Ubuntu,c,ubuntu,exec,C,Ubuntu,Exec,我的问题是:在完成新进程映像的执行之后,函数 execl() 是否将执行返回到调用方进程或父进程?使用exec函数系列中的一个时,您根本不希望函数返回。程序计数器从替换调用进程的二进制映像的第一条指令开始 从达尔文手册页: 如果任何exec()函数返回,则将发生错误。 返回值为-1,全局变量errno将设置为 指出错误 有一条评论询问以下内容,但已被删除: 如果您在子进程中,并且execl成功,则子进程将替换为新的二进制文件。如果失败,则控制返回到该子进程(调用者)。如果你是这么问的话,fork

我的问题是:在完成新进程映像的执行之后,函数

execl()


是否将执行返回到调用方进程或父进程?

使用
exec
函数系列中的一个时,您根本不希望函数返回。程序计数器从替换调用进程的二进制映像的第一条指令开始

从达尔文手册页:

如果任何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;
}
#包括
#包括
#包括
#包括
int main(常量int argc,char*const argv[]){
if(execl(“ls”,“ls”,“la”,NULL)){
perror(空);
出口(errno);
}
返回0;
}

在这种情况下,使用
execlp
而不是
execl

两者都不是;不管孩子做了什么,父进程都会继续它的快乐方式(例如,除非父进程决定等待孩子死去)。祖父母从来不知道孙子的事。任何
exec*()
函数返回的唯一时间是它失败时。谢谢。我以为execl函数会在任何时候被子函数调用时返回到“父”进程。是的,我删除了它,因为我正在编写一个新的:)谢谢