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

本文深入解析exec函数族的工作原理及应用细节,强调加载指定应用程序时关键要素:路径、参数及环境变量。阐述如何通过不同exec函数自定义环境变量,满足特定需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


下图为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系列第三部分为指定,则使用系统的默认值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值