欢迎光临散文网 会员登陆 & 注册

exec系统调用

2022-04-24 22:28 作者:GXTon_阿通  | 我要投稿

可以理解exec就是替换了上下文,实际上没有进行系统的调用.

execve()函数是另外5个函数的基础.


六个函数实现的功能是一样的,

区别在于使用方法,下面是用法的区别:

下面进行分别的举例说明:

为了方便,只摘出其中的一部分.

目的是把子函数换成ls的功能.

 再总结一下六个exec函数的特点:

1,名字中包含l,其参数个数不定.(暂且认为l就是long,长传入的参数长,是不定的.)

2,名字中包含v,其参数是用argv的数组列表传入.

3,名字中包含p,其说明自带有"path"路径,所以就不需要传入路径了,而是直接传入运行的文件明file.

4,名字中包含e,其说明可以指定环境变量envp.(可以指定运行的环境.)



//为了方便记忆,可以联想:

可以记成viper就是vip的人儿,然后   

v代表v    i粗略代表l   p代表p  e代表e

要注意名字中有上面字符,都代表什么意思...

// 下面是execl,名字中有l,所以就是传入的参数是不固定的.最后一个以NULL结尾.

// 名字中没有p,所以要传入路径名.

// 按照格式去套用,第一个参数就是运行程序的路径. "/bin/ls"

// 第二个参数是"ls"  第三个参数是 "-a"

// 最后没有要传输的了,就直接写NULL,表示结尾了. 

    execl("/bin/ls","ls","-a",NULL);

上面的第二个参数 ls和第三个参数 -a,其实可以组合在一起的.

    execl("/bin/ls","ls -a",NULL);

下一个例子: 

 // 有v,所以说明传入的是一个argv字符数组,而不是字符.

// 没有p,所以要传入,路径名.

// 所以要先定义一个字符串的数组:  char *arg[]={"ls","-a",NULL};

    execv("/bin/ls",arg);

下一个例子:

// 名字中有l,说明传入的参数是不定数目的,没有v,所以传入的是字符.以NULL结尾.

// 有p,说明有路径了,只需要传入文件名.

    execlp("ls","ls","-a",NULL);

  

下一个例子:

// 名字中有v,所以参数传入的是字符串的数组.

// 有p,所以只需要传入运行的程序名: ls即可.

// char *arg[]={"ls","-a",NULL};

      execvp("ls",arg);

 

下一个例子:

// 名字中有l,说明传入的参数是不定长的.

// 名字中有e所以,可以指定运行环境.这里没有指令,所以用NULL

// 名字中没有p,所以,用目录名.

execle("/bin/ls","ls","-a",NULL,NULL);

下一个例子:

execve("/bin/ls",arg,NULL);


exec系统调用的评论 (共 条)

分享到微博请遵守国家法律