首页 > 编程知识 正文

python系统函数,linux的exec函数

时间:2023-05-06 14:12:47 阅读:114750 作者:1040

本文介绍了exec函数系列,教程操作方法:exec函数系列

fork ) )函数创建子进程时,子进程通常调用一个e x e c函数运行另一个程序。 当进程调用exec函数时,该进程将被完全新的程序替换,新程序将从ma i n函数运行。 调用exec不会创建新进程,因此不会更改前后进程ID。 exec只是用另一个新程序替换当前进程的正文、数据、堆和堆栈段。 可以使用6种不同的e x e c函数,它们通常统称为e x e c函数。

#包含

intexecl(constchar*pathname,const char* arg0,/* ) char * )0*/);

int execv (常数char * pathname,char *常数argv [ ];

intexecle(constchar*pathname,const char* arg0,/* ) char * ) 0,char *const envp[]*/);

intexecve(constchar*pathname,char *const argv[],char * const envp[];

int execlp (常数char*文件名称,常数char* arg 0,/* ) char * )0*/);

int execvp (常数char *文件名称,char *常数argv [ ];

//返回6个函数:错误时返回-1,成功时不返回

这些函数的第一个区别是前四个采用路径名作为参数,后两个采用文件名作为参数。 如果指定filename作为参数:

如果filename包含/,则将其视为路径名。 否则,按PAT H环境变量在相关目录中查找可执行文件。

PATH变量包含一个称为路径前缀的目录表,目录之间用冒号:分隔。 例如,以下na me=value环境字符串:

PATH=/健壮的大神3:/usr/健壮的大神:/usr/local/健壮的大神3360被指定在4个目录中进行搜索。 (零长度前缀也表示当前目录。 在value开头可用:在行中间用“:”表示,在行末用“:”表示。 )

如果execlp或execvp使用路径前缀之一找到可执行文件,但该文件不是连接编辑器生成的计算机可执行代码文件,则认为该文件是shell脚本,并使用/strong健的大神/sh 第二个区别与参数表的传递有关(l是表(l i s t ),v是向量(v e c t o r ) )。 函数execl、execlp和execle要求将新程序的每个命令行参数编写为单独的参数。 此参数表以空指针结束。

对于其他三个函数(execv、execvp、execve ),必须首先创建指向每个参数的指针数组,并将该数组地址作为这三个函数的参数。 使用ANSIC原型之前,为三个函数(execl、execle和execlp )表示命令行参数的常见方法是: char *arg 0、char *arg 1、char *arg n、 如果不转换,则将其解释为整数参数。 如果整数长度与char *的长度不同,则exec函数的实际参数会出错。 最后的区别与向新程序传递环境表有关。 以e结尾的两个函数(execle和execve )可以传递指向环境字符串指针数组的指针。 其他四个函数使用正在调用的environ变量复制新程序的现有环境。 通常,一个进程允许将该环境传播到子进程,但在某些情况下,该进程可能会尝试为子进程指定特定环境。

例如,在初始化新登录的shell时,login程序会创建一个只定义少数变量的特殊环境,但在我们登录时,可以从shell启动文件并将其他变量添加到环境中。

在使用ANSI C原型之前,execle的参数包括char * pathname、char *arg 0、char *a rg n、(char * ) 0、 在char *envp[ ]中,最后一个参数是指向环境字符串中每个字符指针组成的数组的指针的ANSIC原型中,所有命令行参数(包括空指针)都用省略号()表示这6个e x e c函数的参数很难记忆。 函数名的文字有帮助。 字母p表示函数

使用filename作为参数,并使用PATH环境变量查找可执行文件。 字符l表示此函数采用与字符v互斥的参数表。 v表示函数采用arg v[ ]。 最后,字符e表示函数采用e nvp[ ]数组,而不使用当前环境

这六个函数中只有一个execve是内核的系统调用。 另外五个是库函数,最终调用系统调用。 这六个函数之间的关系如图8 - 2所示。 在此部署中,库函数execlp和execvp使用PATH环境变量查找名为filenam的第一个包含

e的可执行文件的路径名前缀。

例1:

1 #include

2 #include

3 #include

4

5 int main(int argc,char * argv[])

6 {

7 if(argc<2)

8 {

9 perror("you haven't input the filename,please try again!n");

10 exit(EXIT_FAILURE);

11 }

12 if(execl("./create_file","create_file",argv[1],NULL)<0)

13 perror("execl error");

14 }

可以看见的是有一个名为create_file的可执行文件用于创建文件。在这里我们使用execl函数替换程序。

例2:

代码:

1 #include

2 #include

3 #include

4

5 int main(int argc,char * argv[])

6 {

7 if(argc<2)

8 {

9 perror("you haven't input the filename,please try again!n");

10 exit(EXIT_FAILURE);

11 }

12 if(execl("/健壮的大神/touch","touch",argv[1],NULL)<0)

13 perror("execl error");

14 }

可以看见我们将exec2 成功的替换为了touch。并成功的执行了。

参考资料

Linux/Unix系统编程手册

Unix环境高级编程

Linux程序设计exec函数族就为您介绍到这里,感谢您关注懒咪学编程c.lanmit.com.

本文地址:https://c.lanmit.com/czxt/Linux/119544.html

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。