您的位置:首页 > 其它

exec系列中,各函数对envornment的操作

2014-06-17 11:06 288 查看
下图为exec系列函数的依赖关系,其他5个函数最终都依赖execve来实现其功能。



使用exec系列函数在新进程中加载指定的应用时,需要关注的重点有:1.要加载的可执行文件的路径;2.命令行参数;3.环境变量列表。

使用exec系列函数的目的是,向已创建好的进程容器中,填充相应的内容。根据进程的内存布局可知,由环境变量列表,命令行参数,stack,heap,bss,ds,cs组成。其中,cs,ds,bss依赖于磁盘上的可执行文件,因此,需要exec系列函数,通过指定可执行文件的完整路径(不带p的函数),或通过环境变量PATH和文件名(带p的函数)来指定加载到新进程容器中的代码段,数据段,bss段。而对于stack和heap则有系统指定,并且在程序运行过程中,动态改变。最后,对于需要传递给要运行的程序的命令行参数,则通过exec系列函数的参数列表或参数数组来指定。对于所有的exec系列函数,其形参列表可以分为3部分,第一部分为可执行文件的路径或文件名,为形参列表的第一个参数;第二部分为命令行参数,个数不固定,但是,最后一个必须为(char
*) 0;第三部分为可选的,对于带e的函数有效,为用户指定的环境列表,不是系统变量environ。其中,第二部分和第三部分通过(char *)0来分割。

对于环境变量,当使用不同的exec函数时,其值可能不一样。如果使用带e的函数,则其第三部分参数指定填充到进程容器中,environment list部分的值,带e的函数的第三部分或者指定的是自定义的环境变量。如UNIX环境高级编程,第8章,figure 8.16所示。

char * env_init[] = {"USER=unknowd" , "PATH=/tmp" , NULL} ;

execle("/home/sar/bin/echoall" , "echoall" , "arg0" , "arg1" , (char *)0 , env_init) ;

此种情况下,进程容器使用的环境变量不是系统变量environ中的值,为用户自定义的。满足了用户希望使用自定义环境变量的需求。应为在很多情况下,系统环境变量过于复杂,绝大多数是不需要的。

char ** environ ;

execle("/home/sar/bin/echoall" , "echoall" , "arg0" , "arg1" , (char *)0 , environ) ;
也可以如上例所示,将environ指定为第三部分参数,以满足需要使用系统设置的环境变量的方式。此种情况下,如果需要在传入用户自定义的环境变量,可以将自定义的环境变量作为命令行参数传入。

注意:

exec系列中带e的函数的第三部分参数,将覆盖全局变量environ。如UNIX环境高级编程第8章,figure 8.16例子所示。第一个fork创建的新进程,指定用户之定义环境变量env_init[]作为新进程的环境变量,此时,在echoall中,environ的值是env_init的值。由此,可推断,全局变量environ的值是由exec系列的函数的第三部分参数所决定的,environ的值,来自于exec系列函数的第三部分。若exec系列第三部分为指定,则使用系统的默认值。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: