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系列第三部分为指定,则使用系统的默认值。
使用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系列第三部分为指定,则使用系统的默认值。
相关文章推荐
- exec系列函数的实现
- 操作 Wave 文件(3): 接触 mmio 系列函数
- 启动新进程(fork和exec系列函数实现)
- 关于exec系列函数的文件路径问题及延伸
- 原子操作 Interlocked系列函数
- JS 操作IE游览器常用函数:window.external,history,document.execCommand,window.location,WebBrowser.ExecWB
- Redis系列-存储篇string主要操作函数小结
- 秒杀多线程第三篇 原子操作 Interlocked系列函数 .
- 【转】秒杀多线程第三篇 原子操作 Interlocked系列函数
- windows线程同步-原子操作-Interlocked系列函数(用户模式)
- 关于在WIN32调用一些Zw系列的文件操作函数
- exec... 系列函数
- TTCN3新执行器系列-如何最小化类的成员函数(对拷贝构造和赋值操作函数的反思)
- 多线程之三 原子操作 Interlocked系列函数
- [推荐][提供下载](Excel):常用函数公式及操作技巧系列文章【共十篇】
- openssl之BIO系列之6---BIO的IO操作函数
- 关于在WIN32调用一些Zw系列的文件操作函数
- [推荐][提供下载](Excel):常用函数公式及操作技巧系列文章【共十篇】
- 秒杀多线程第三篇 原子操作 Interlocked系列函数
- 秒杀多线程第三篇 原子操作 InterLocked系列函数