侧边栏壁纸
博主头像
noerror

虚灵不寐,众理具而万事出。

  • 累计撰写 239 篇文章
  • 累计创建 9 个标签
  • 累计收到 2 条评论
标签搜索

目 录CONTENT

文章目录

exec函数用法详解

noerror
2022-11-08 / 0 评论 / 0 点赞 / 168 阅读 / 1,409 字 / 正在检测是否收录...

exec函数用法详解

exec函数简介

  • 头文件包含
#include <unistd.h>
  • 函数定义
extern char **environ;
int execl(const char * pathname , const char * arg , ...
                 /* (char  *) NULL */);
int execlp(const char * file , const char * arg , ...
                 /* (char  *) NULL */);
int execle(const char * pathname , const char * arg , ...
                /*, (char *) NULL, char *const  envp [] */);
int execv(const char * pathname , char *const  argv []);
int execvp(const char * file , char *const  argv []);
int execvpe(const char * file , char *const  argv [],
                char *const  envp []);

exec函数常见使用错误

  • 编译错误
    warning: implicit declaration of function ‘exec’ [-Wimplicit-function-declaration]
    解决办法:包含头文件
#include <unistd.h>

exec函数详细描述

exec ()系列函数用新的流程映像替换当前的流程映像。本手册页中描述的功能位于execve (2)之上(有关替换当前进程映像的更多详细信息,请参见execve (2)手册页)
这些函数的初始参数是要执行的文件名。
可以根据“exec”前缀后面的字母对函数进行分组。l - execl() execlp() execle() "const char\ *arg"和随后的省略号可以被认为是arg0 、arg1 &...、argn 它们一起描述了一个或多个指向空终止字符串的指针的列表,这些字符串表示可用于执行的程序的参数列表。按照惯例,第一个参数应该指向与正在执行的文件相关联的文件名。参数列表must由一个空指针终止,而且,因为这些是可变函数,所以这个指针必须转换为"(char\ *) NULL"
与“l”函数相反,“v”函数(如下)将已执行程序的命令行参数指定为向量。v - execv() execvp() execvpe() "char\ *const argv[]"参数是指向以空结尾的字符串的指针数组,这些字符串表示新程序可用的参数列表。按照惯例,第一个参数应该指向与正在执行的文件相关联的文件名。指针数组must由空指针终止。e - execle() execvpe()调用者的环境通过参数envp 指定。envp参数是指向空终止字符串的指针数组,must由空指针终止。
所有其他exec ()函数(后缀中不包含“e”)从调用进程中的外部变量environ获取新进程映像的环境。p - execlp() execvp() execvpe()如果指定的文件名不包含斜杠(/)字符,这些函数会复制shell在搜索可执行文件时的操作。在 PATH 环境变量中指定的以冒号分隔的目录路径名列表中查找该文件。如果没有定义这个变量,路径列表默认为一个列表,其中包括confstr(_CS_PATH)返回的目录(通常返回值“/bin:/usr/bin”),也可能包括当前工作目录;有关更多详细信息,请参见注释。
如果指定的文件名包含斜杠字符,则忽略 PATH ,并执行指定路径名下的文件。
此外,对某些错误进行了特殊处理。
如果文件的权限被拒绝(尝试的execve (2)失败,错误为EACCES ),这些函数将继续搜索搜索路径的其余部分。但是,如果没有找到其他文件,它们将返回errno,并将PPPP2设置为EACCES
如果无法识别文件的头(尝试的execve (2)失败,错误为ENOEXEC )),这些函数将执行shell.ri(/bin/sh),并将文件的路径作为其第一个参数。(如果尝试失败,则不会进行进一步的搜索。)
所有其他exec ()函数(后缀中不包含“p”)的第一个参数是标识要执行的程序的(相对或绝对)路径名。

exec函数返回值

exec ()函数仅在发生错误时返回。返回值是-1,并将errno设置为指示错误。

exec函数错误码

所有这些功能都可能失败,并针对为execve (2)指定的任何错误设置errno

exec函数其他说明

默认的搜索路径(当环境不包含变量\fBPATH\fR时使用)显示了不同系统之间的一些差异。它通常包括/bin和/usr/bin(按此顺序),也可能包括当前工作目录。在其他一些系统上,当前工作包含在/bin和/usr/bin 之后,作为反特洛伊木马措施。glibc实现长期以来遵循传统的默认设置,即当前工作目录包含在搜索路径的开头。然而,在glibc 2.24开发过程中的一些代码重构导致当前工作目录从默认搜索路径中完全删除。这种偶然的行为改变被认为是温和有益的,不会恢复。
当尝试执行文件时出现错误时,execlp ()和execvp ()的行为是历史惯例,但传统上没有记录,也没有被POSIX标准指定。如果遇到 ETXTBSY ,BSD(可能还有其他系统)会自动休眠并重试。Linux将其视为硬错误并立即返回。
传统上,函数execlp ()和execvp ()忽略除了上面描述的错误以及返回的 ENOMEM 和E2BIG 之外的所有错误。现在,如果发生上述错误之外的任何错误,它们都会返回。

0

评论区