2016-02-03 2 views
0

Чтобы обновить среду var, называемую DOLP, в дочернем процессе, и это изменение должно быть видимым в родительском процессе. код выглядит следующим образом:Как передать среду var от дочернего к родительскому?

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 для значения сд. Теперь, как сделать дочерние обновления в DOLP видимыми в родительском процессе.

ответ

3

Вы не можете, а не напрямую. Родители и дети - это разные процессы с отдельными средами. Установка переменной среды в дочернем объекте не влияет на родителя и наоборот.

Исключением является то, что сначала создается дочерний процесс. Его исходная среда - это копия среды родителя. Но после того, как ребенок создан, он полностью разделен.

Если вы хотите, чтобы один процесс изменил среду другого, вам нужно настроить явное общение между ними и отправить дочернего родителя сообщение, чтобы он изменил свою среду. Это может быть через трубу, сокет, общую память или другой механизм взаимодействия между процессами.

+0

По умолчанию среда ребенка является копией родительского элемента - если системный вызов 'execve()' не использовался для указания альтернативной среды. –

+0

Вопрос был задан при создании основного (родительского) и дочернего. Родитель и ребенок должны по очереди отсчитывать среду var DOLP. Для достижения этого результата вы синхронизируете Parent, Child для повторного сна (sleep()), пробуждаете, печатаете и очищаете отпечатанную линию (вызов fflush()). И я сомневаюсь, что это возможно. – Uma

Смежные вопросы