linux编程:exec函数初识

看完UNIX系统高级编程,获得的第一个信息:exec是一个函数集合,一共包含7个函数。看图
在这里插入图片描述
作用:当fork完之后,子进程执行的程序被完全替代成新程序,但是并没有创建新进程,只是替换了当前进程的数据段、正文段、堆段、栈段。打个比方就好像你穿越到另一个世界了,你还是你,灵魂(进程ID)没有变,但是身份、年龄(数据段、正文段、堆段、栈段)变了,要做的事情和之前也不一样。

七个函数的区别:
第一:参数的区别(第一个参数)
在这里插入图片描述
第二个区别:传递的方式
1、execl execlp execle 这个函数名中都带有“l”,要求将新程序的每个命令行函数都作为单独的函数传入,以空指针结尾。== const char *arg0==
2、execv、execve、execvp、fexecve/ 这四个则要求构造一个指向各个函数的指针数组,然后将指针数组的地址作为参数 char *const argv[]

第三个区别:环境表
execve、execle 、 fexecve 这三个第三个参数可以传递一个指向环境字符串的指针数组 *const envp[]
其他四个,则从environ变量为。

看个例子:
用exec执行ls命令,参数传-al 路径

#include<stdio.h>
#include<sys/wait.h>
#include<stdlib.h>
#include<unistd.h>
int main (){
   int status,pid;
   pid = fork();
   char *envp[5];
   char *argv[3] = {"ls","-ll","/home/zero/c"};
   /*
 * 	
 *,我们将第一个参数(新程序中的argv[0])设
置为路径名的文件名分量。某些shell将此参数设置为完全的路径名。这只是一个惯例我们可将
argv【0]设置为任何子符串当 login shell BT时就是这样做的在执行 shez之前,login
在argv[o]之前加一个/作为前级,这向shel指明它是作为登录she被调用的
 *
 *
 * 	*/
   if(pid < 0){
	exit;
   }else if(pid == 0){
	//ls命令打印/home/zero/c的文件
	//execlp("ls","-ll","/home/zero/c",(char *)0);//传相对路径,新程序复制现有的环境
	execvp("ls",argv);
	
	//execl("/bin/ls","-ll","/home/zero/c",(char *)0);//传绝对路径,新程序复制现有的环境
	//execle("/bin/ls","-ll","/home/zero/c",(char *)0,envp);//需要传递一个指向环境字符串的指针数组
	//	
   
        // execve("/bin/ls",argv,envp);//绝对路径,参数为数组形式,环境也为数组形式
        //execv("/bin/ls",argv);


   }

   wait(&status);
   return 0;

}

相关视频:https://study.163.com/course/introduction/1209187856.htm

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值