【作業記録】環境変数が子プロセスに引き継がれるか確認してみた件

環境変数が子プロセスに引き継がれるか実際に確認してみました

  • 確認してみたことは次の2つ
  • fork() 前に設定していた環境変数は親、子プロセスで見えるか?
  • fork() 後に親で環境変数を追加すると子プロセスで見えるか?
  • 作ったプログラムはこちら
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

int
main(void)
{
    putenv("BEFORE_FORK=HELLO");

    pid_t pid;
    pid = fork();

    if (pid == -1)
    {
        perror("");
        exit(EXIT_FAILURE);
    }
    
    if (pid != 0)
    {
        fprintf(stderr, "(parent:%d) getenv %s\n", getpid(), getenv("BEFORE_FORK"));
        fprintf(stderr, "(parent:%d) putenv %s\n", getpid(), "PARENT");
        putenv("PARENT=HELLO_FROM_PARENT");
        wait(NULL);
        exit(EXIT_SUCCESS);
    }
    else
    {
        sleep(10);
        fprintf(stderr, "(child:%d) getenv %s\n", getpid(), getenv("BEFORE_FORK"));
        fprintf(stderr, "(child:%d) getenv %s\n", getpid(), getenv("PARENT"));
        exit(EXIT_SUCCESS);
    }
    
}

動作結果はこちら

$ ./fork_env 
(parent:4552) getenv HELLO
(parent:4552) putenv PARENT
(child:4553) getenv HELLO
(child:4553) getenv (null)

結論として

  • fork() 前にセットしておいた環境変数は親子プロセスで見える
  • fork() 後に親プロセスがセットした環境変数は、子プロセスからは見えない
  • 親プロセス、子プロセスで、事前に渡したい情報があるなら環境変数が使える
  • 事前に渡したい情報がわからないのであればパイプなどを使えばいい?