韦德国际_韦德国际1946官方网站_韦德国际1946手机版
做最好的网站

经过调整之exec函数,Linux进程序调控制

日期:2019-07-10编辑作者:韦德国际

1、简介
 
在Linux中,并不真实exec()函数,exec指的是一组函数,一共有6个,分别是:

用fork函数创立子进程后,子进度往往要调用一种exec函数以推行另三个先后。当进度调用一种exec函数时,该进程实施的主次完全替换为新程序,而新程序则从其main函数开头实行。因为调用exec并不创建新进度,所在此之前后的进度ID并未有改造。exec只是用四个簇新的顺序替换了当下历程的正文、数据、堆和栈段。

#include <unistd.h>
extern char **environ;
int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg, ..., char * const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *经过调整之exec函数,Linux进程序调控制。const argv[]);
int execve(const char *path, char *const argv[], char *const envp[]);

有6种分裂的exec函数可供使用,它们平日被统称为exec函数。这个exec函数使得UNIX进度调节原语特别圆满。用fork能够创立新进程,用exec能够进行新程序。exit函数和多个wait函数管理终止和等候终止。这几个是大家必要的主干的历程序调整制原语。

详见定义:
 
execl(实践文书)
 相关函数
    fork,execle,execlp,execv,execve,execvp
 表头文件
    #include<unistd.h>
 定义函数
    int execl(const char * path,const char * arg,....);
 函数表明
    execl()用来实行参数path字符串所表示的文件路径,接下去的参数代表实施该公文时传递过去的argv(0)、argv[1]……,最终二个参数必须用空指针(NULL)作了结。
 返回值
    要是实践成功则函数不会再次来到,实践倒闭则向来回到-1,败因存于errno中。
 范例
    #include<unistd.h>
 main()
 {
 execl(“/bin/ls”,”ls”,”-al”,”/etc/passwd”,(char * )0);
 }
 执行
    /*执行/bin/ls -al /etc/passwd */
 -rw-r--r-- 1 root root 705 Sep 3 13 :52 /etc/passwd
  
 
 execlp(从PATH 情状变量中查找文件并推行)
 相关函数
    fork,execl,execle,execv,execve,execvp
 表头文件
    #include<unistd.h>
 定义函数
    int execlp(const char * file,const char * arg,……);
 函数表明
    execlp()会从PATH 景况变量所指的目录中找找符合参数file的公文名,找到后便实行该公文,然后将第一个今后的参数作为该文件的argv[0]、argv[1]……,最终七个参数必须用空指针(NULL)作了结。
 返回值
    借使执行成功则函数不会回到,推行倒闭则直接再次来到-1,失败原因存于errno 中。
 错误代码
    参考execve()。
 范例
    /* 实行ls -al /etc/passwd execlp()会依PATH 变量中的/bin找到/bin/ls */
 #include<unistd.h>
 main()
 {
 execlp(“ls”,”ls”,”-al”,”/etc/passwd”,(char *)0);
 }
 执行
    -rw-r--r-- 1 root root 705 Sep 3 13 :52 /etc/passwd
  
 execv(实践文书)
 相关函数
    fork,execl,execle,execlp,execve,execvp
 表头文件
    #include<unistd.h>
 定义函数
    int execv (const char * path, char * const argv[ ]);
 函数表明
    execv()用来实施参数path字符串所表示的文书路线,与execl()分歧的地方在于execve()只需五个参数,第一个参数利用数组指针来传递给实践文书。
 返回值
    如若进行成功则函数不会回到,施行停业则直接重临-1,失败原因存于errno 中。
 错误代码
    请参考execve()。
 范例
    /* 执行/bin/ls -al /etc/passwd */
 #include<unistd.h>
 main()
 {
 char * argv[ ]={“ls”,”-al”,”/etc/passwd”,(char*) }};
 execv(“/bin/ls”,argv);
 }
 执行
    -rw-r--r-- 1 root root 705 Sep 3 13 :52 /etc/passwd 

#include <unistd.h>

 execl(   *pathname,   *arg0, ...  execv(   *pathname,  * execle(   *pathname,   *arg0, ...  execve(   *pathname,  * argv[],  * execlp(   *filename,   *arg0, ...  execvp(   *filename,  *-,若成功则不返回值

   
 execve(实施文书)
 相关函数
    fork,execl,execle,execlp,execv,execvp
 表头文件
    #include<unistd.h>
 定义函数
    int execve(const char * filename,char * const argv[ ],char * const envp[ ]);
 函数表明
    execve()用来进行参数filename字符串所代表的文书路线,第二个参数系行使数组指针来传递给实施文书,
    argv要传递给程序的总体参数列表,包罗argv[0],它一般是实践顺序的名字;最终贰个参数则为传送给实践文书的新景况变量数组。
 返回值
    倘诺推行成功则函数不会回来,试行停业则直接重回-1,失败原因存于errno 中。
 错误代码
    EACCES
 1. 欲进行的公文不抱有用户可试行的权柄。
 2. 欲施行的文本所属的文件系统是以noexec 格局挂上。
 3.欲实行的文书或script翻译器非一般文件。
 EPERM
 1.进度处于被追踪形式,实践者并不具备root权限,欲实行的文本具备SUID 或SGID 位。
 2.欲试行的文本所属的文件系统是以nosuid格局挂上,欲施行的公文具备SUID 或SGID 位元,但奉行者并不具备root权限

那几个函数之间的率先个区分是前4个取路线名作为参数,后五个(execlp和execvp,p表示PATH,个人驾驭)则取文件名作为参数当钦定filename作为参数时

里头独有execve是实在意义上的系列调用,别的都以在此基础上经过包装的库函数。

  • 设若filename中包括了/,则将其视为路线名。
  • 要不就按PATH情况变量,在它所钦点的各目录中搜索可施行文件。

exec函数族的功能是依靠钦赐的文书名找到可实施文件,并用它来代表调用进度的开始和结果,换句话说,正是在调用进度之中进行多个可实行文件。这里的可实施文件不仅可以够是二进制文件,也得以是任何Linux下可推行的台本文件。

PATH变量包涵了一张目录表(称为路线前缀),目录以内用冒号(:)分隔。举个例子name = value意况字符串:

图片 1

PATH=/bin:/usr/bin:/usr/local/bin/:.

点名在4个目录中实行检索。最后的必定要经过的地方前缀(.)象征当前目录。(零长前缀也意味当前目录。在value的起初处可用:表示,在行中间则要用::表示,在行尾则以:表示。)

假如execlp或execvp使用路线名前缀中的一个找到了叁个可实践文件,不过该文件不是由连接编辑器发生的机械可试行文件,则以为该公文是三个shell脚本,于是试着调用/bin/sh,并以该filename作为shell的输入。

其次个界别与参数表的传递有关(l表示list,v表示矢量vector)。函数execl、execlp和execle供给将新程序的各类命令行参数都申明为一个独自的参数。这种参数表以空指针结尾。对于其余多少个函数(execv、execvp和execve),则应先构造五个针对性各参数的指针数组,然后将该数组地址作为那多个函数的参数。

在ISO C原型此前,对execl、execle和execlp那三个函数表示命令行参数的形似方法是:

char *arg0, char *arg1, …, char *argn, (char *)0

应当特别提议的是:在最后三个命令行参数之后跟了贰个空指针。借使用常数0来代表二个空指针,则必须将它强制调换为二个字符指针,不然将它表达为整型参数。要是一个整型数的长短与char *的长短差异,那么exec函数的实际参数就将出错。

终极一个组别与向新程序传递情形表相关。以e结尾的几个函数(execle和execve)能够传递三个针对意况字符串指针数组的指针。其余多个函数则动用调用进度中的environ变量为新程序复制现有的蒙受。平常,贰个进程允许将其条件传播给其子进度,但临时也可能有这种气象,即经过想要为子进度钦命某贰个鲜明的条件。

在利用ISO C原型在此以前,execle的参数是:

char *pathname, char *arg0, …, char *argn, (char *)0, char *envp[]

本文由韦德国际发布于韦德国际,转载请注明出处:经过调整之exec函数,Linux进程序调控制

关键词: 伟德手机版1946