Linux exec函数,python3 exec函数

  Linux exec函数,python3 exec函数

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

  Fork))函数创建子进程时,子进程通常会调用一个e x e c函数来运行另一个程序。当一个进程调用exec函数时,它将被一个全新的程序所取代,而这个新程序将从主函数中运行。调用exec不会创建一个新的进程,所以不会改变前端和后端的进程id。Exec只是用另一个新程序替换了当前进程的主体、数据、堆和栈段。您可以使用六种不同的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 (constant char*文件名,constant char* arg 0,/*)char *)0 */);

  Int execvp(常量char *文件名,char *常量argv[];

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

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

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

  PATH变量包含一个名为path prefix的目录表,目录之间用冒号分隔:例如,以下na me=value环境字符串:

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

  如果execvp或execpv使用其中一个路径前缀查找可执行文件,但该文件不是连接编辑器生成的计算机可执行代码文件,则认为它是一个shell脚本,并使用/strongjiandashen /sh。第二个区别与参数表的传递有关(L是表(l i s t),V是a v e c t o r (V E C T O R))。函数execl、execlp和execle要求新程序的每个命令行参数都作为单独的参数编写。此参数表以空指针结尾。

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

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

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

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

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

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

  示例1:

  1 #包括

  2 #包括

  3 #包括

  四

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

  6 {

  7 if(argc2)

  8 {

  9 perror(您还没有输入文件名,请再试一次!n’);

  10退出(EXIT _ FAILURE);

  11 }

  12 if(execl(。/create_file , create_file ,argv[1],NULL)0)

  13 perror(execl错误);

  14 }

  您可以看到有一个名为create_file的可执行文件用于创建该文件。这里我们用execl函数来代替程序。

  示例2:

  代码:

  1 #包括

  2 #包括

  3 #包括

  四

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

  6 {

  7 if(argc2)

  8 {

  9 perror(您还没有输入文件名,请再试一次!n’);

  10退出(EXIT _ FAILURE);

  11 }

  1if(execl(/鲁棒大神/touch , touch ,argv[1],NULL)0)

  13 perror(execl错误);

  14 }

  你可以看到我们已经成功地用touch取代了exec2。并成功实施。

  参考数据

  Linux/Unix系统编程手册

  Unix环境高级编程

  Linux编程的exec函数系列就是为您准备的。感谢您对c.lanmit.com的关注。

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

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: