【问题标题】:How pass an environment var from child to parent?如何将环境变量从孩子传递给父母?
【发布时间】:2025-11-24 17:40:01
【问题描述】:

在子进程中更新名为 DOLP 的环境变量,并且此更改应在父进程中可见。 代码如下:

    int main(void) {
        int cid1 ,i;
        char ear[20]="DOLP=7";
        putenv(ear);

        printf("parent(main) process %d, ppid is %d  t %d \n",getpid(),
                getppid(),atoi(getenv("DOLP")));
        fflush(stdout);
        cid1=fork();

        if ((cid1 == 0)) {
          //child process ...
          int sd =atoi(getenv("DOLP")) -1;
          char v[10];
          sprintf(v,"%d",sd);
          setenv("DOLP",v,1);
          sleep(2);
          printf("c process pid %d, ppid is %d sd value: %d\n", getpid(),
                  getppid(),atoi(getenv("DOLP")));
          fflush(stdout);
          sleep(1);
          } 
      else{
           sleep(2);
           //parent process...
           int sd =atoi(getenv("DOLP")) -1;
           sprintf(ear,"DOLP=%d",sd);
           putenv(ear);
           sleep(1);
           printf("parent(main) process %d, ppid is %d sd value %d\n",
                    getpid(),getppid(),atoi(getenv("DOLP")));
           fflush(stdout);
           }
    return 0;
}

我得到的输出如下:

parent(main) process 25958, ppid is 25955  t 7 
c process pid 25968, ppid is 25958 sd value: 6
parent(main) process 25958, ppid is 25955 sd value 6

实际上我希望父级打印 5 作为 sd 值。 现在如何使 DOLP 上的子更新在父进程中可见。

【问题讨论】:

    标签: c unix operating-system


    【解决方案1】:

    你不能,不能直接。父母和孩子是具有不同环境的不同过程。在子进程中设置环境变量对父进程没有影响,反之亦然。

    第一次创建子进程时例外。它的初始环境是父环境的副本。但是在孩子被创建之后,它是完全独立的。

    如果您希望一个进程更改另一个进程的环境,您需要在两者之间建立明确的通信,并让子进程向父进程发送一条消息,告诉它更改其环境。这可以通过管道、套接字、共享内存或其他进程间通信机制实现。

    【讨论】:

    • 默认情况下,子环境是父环境的副本——除非使用execve() 系统调用指定替代环境。
    • 在创建 main(parent) 和 child 时询问了问题。父母和孩子应该轮流倒计时环境变量DOLP。要实现此输出,您将同步 Parent、Child 以重复睡眠(sleep() 调用)、唤醒、打印和刷新打印行(fflush() 调用)。我怀疑这是否可能。
    最近更新 更多