在调用exec系列时是否更换,复制或共享环境变量?

时间:2014-06-24 20:01:43

标签: c environment-variables exec

我在C中尝试了一些exec族函数,我对环境变量的问题很少,这是我的代码:

find.c

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(int argc, char *argv){
    char *line = getenv("LINE");
    char *target = getenv("TARGET");

    if(!line || !target){
        printf("LINE or/and TARGET not found\n");
        return 1;
    }

    if(strstr(line,target))
        puts(line);
    return 0;
}

process.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(){
    putenv("LINE=Hello world");
    putenv("TARGET=Hello");

    execl("./find","./find",NULL);
    return 0;
}

输出“gcc process.c -o process&amp;&amp; ./process”

Hello world

快速解释代码。

find.c 需要读取两个环境变量并检查TARGET变量值是否为LINE变量值的子字符串。如果是,则打印LINE变量值。

process.c 通过执行 find.c 来替换自己。

问题

知道正确的方法是使用execle,为什么程序process.c使用execlputenv?换句话说,如果没有通过execle传递,那么在被替换的进程中创建环境变量也不会替换环境变量?

fork进程是否对上述问题有相同的答案?那么请求进程复制,替换或共享环境变量吗?

谢谢

1 个答案:

答案 0 :(得分:1)

  

知道正确的方法是使用execle,为什么程序process.c使用execlputenv

man page

中对此进行了解释
  

execle()execvpe()函数允许调用者通过参数 envp 指定执行程序的环境。 [...]其他函数在调用过程中从外部变量 environ 获取新过程映像的环境。

请注意 environ 是由putenv修改的内容。


  

分叉过程是否与上述问题有相同的答案?

Forking复制环境变量。来自man page

  

新进程(称为子进程)与调用进程完全相同,称为父进程,除以下几点外:

     

[...点数列表,其中没有一个是指环境变量...]