C 如何不将环境变量传播到子进程的命令?

C 如何不将环境变量传播到子进程的命令?,c,environment-variables,fork,C,Environment Variables,Fork,我试图理解使用fork()和execv()的C编码项目的规范 本质上,我被告知需要根据二进制值将shell的环境变量传播或不传播到我在子进程中执行的命令 尽管如此,我还是应该将提供给我在子系统中执行的命令的任何附加环境变量传递进来 这整个想法对我来说是新的信息,所以我只是想理解这到底意味着什么 据我所知,当使用fork()创建子进程时,父进程的环境变量将传递给子进程,然后在子进程中运行execve()函数时,可以将任何其他环境变量更改作为该函数的参数 但是如果是这种情况,那么环境变量总是从父/外

我试图理解使用fork()和execv()的C编码项目的规范

本质上,我被告知需要根据二进制值将shell的环境变量传播或不传播到我在子进程中执行的命令

尽管如此,我还是应该将提供给我在子系统中执行的命令的任何附加环境变量传递进来

这整个想法对我来说是新的信息,所以我只是想理解这到底意味着什么

据我所知,当使用fork()创建子进程时,父进程的环境变量将传递给子进程,然后在子进程中运行execve()函数时,可以将任何其他环境变量更改作为该函数的参数

但是如果是这种情况,那么环境变量总是从父/外壳传播的,对吗?那么区别是什么,我如何不传播这些变量呢


谢谢您的时间。

fork()
之后和
execv()之前,您仍然可以控制

在这个过程中,您可以对孩子的环境进行不希望对家长进行的更改,包括调用
unsetenv()


或者,您可以完全构造一个新环境,并在
envp
参数中将其传递给
execve()

如果您理解
fork(2)
,那么您将知道父环境和子环境完全相同(除了
fork()
返回的值),因此,父进程的环境与子进程的环境完全相同。没有其他方法可以将环境传递给子进程。。。因为
execve(2)
不会创建新进程。您只能通过在进程的虚拟空间上加载新程序来加载该进程的虚拟空间。这允许您更改环境,就像在参数列表中一样。将
argc
argv
视为向程序传递位置参数的某种方式,将环境视为向程序传递命名参数的某种方式。两者都是完全相同的东西,但一个是按位置查找的,而另一个是按名称访问的


但是在
execve(2)
(或者它的任何变体)上都不会创建新的进程。

除非您真正询问bash,否则不要标记
bash
unsetenv()
的复杂之处在于您必须知道要取消设置哪些名称。获取整个环境意味着查找
environ
(一个未在任何POSIX头中声明的变量)并单步查看其中的内容。但是在单步遍历列表时使用
unsetenv()
可能会使指向
environ
表示的列表的指针无效-您必须担心
environ
现在是否指向其他地方。或者在第一次访问中收集名称,然后在大量使用
unsetenv()
之前清除收集的名称。