2016-10-28 171 views
0

内部指针递增一个变量的值下面这段代码应该执行作为参数传递外部程序主要通过儿童叉

#include<stdio.h> 
#include<stdlib.h> 
#include<unistd.h> 
#include<sys/types.h> 
#include<sys/wait.h> 


int main(int argc ,char* argv[]) 
{ 
    int e =0; 
    int* f=&e; 
    printf("%p\n",f); 
    pid_t p ; 
    for(int i=1;i<argc;i++) 
    { 
     p=fork(); 
     wait(NULL); 
     if(p==0) 
     { 
      printf("\n---------------------\n"); 
      execvp(argv[i],&argv[i]); 
      printf("erreur \n"); 
      (*f)=(*f)+1; 
      printf("%d\n",*f); 
      printf("%p\n",f); 
      exit(); 

     } 
    } 
    if(p>0) 
    { 
     printf("erreurs: %d \n",*f ); 
    } 
    return 0; 
} 

该计划还旨在显示有多少错误发生。但是,即使指向其地址的指针* f在子分叉内增加,变量e = 0仍然为0。

我该如何解决这个问题?

+1

分叉后,孩子收到父母的记忆的副本。因此对变量的更改不会传播回父级。 –

+1

整个过程的关键是它们有单独的地址空间。如果你想在进程之间共享内存,你必须在分叉之前设置它(参见mmap),然后确保你的e变量在该共享内存块中。 – PSkocik

回答

4

当您拨打fork时,该过程被复制。父母和孩子都有自己的私人记忆地图,他们自己的所有变量。一个进程不可能改变另一个进程变量的值。

如果要在两个进程之间共享数据,则应使用其他inter-process communication方法,例如shared memory