2011-02-16 75 views
4

我需要创建一定数量的并发子进程。我还希望每个子进程都修改一个全局变量,以便主父进程可以在其最后修改版本中进行打印。当我运行下面的程序时,'k'的最终值将是5,所以全局变量不会改变。如果我删除“exit(0)”部分,那么全局变量会改变,但是这次创建的子进程数量会变大。如何使用fork创建一定数量的子进程()

使用fork(),我将如何创建X个可以修改主父进程中的数据(全局变量,局部变量等)的子进程?

int k = 5; // global variable 

int main(){ 

    int i=0; 
    int status; 

    for(i = 0; i<5; i++){ 
    if(fork() == 0){ 
     printf("child %d %d\n", i, ++k); 
     sleep(5); 
     printf("done %d\n",i); 
     exit(0); 
    } 
    } 

    return 0; 
} 
+1

你回答了你自己的问题 - 使用for循环。 – 2011-02-16 17:36:28

回答

1

子进程默认情况下不能改变父进程的地址空间中的任何内容。你需要共享内存,以及一个互斥机制来防止竞争条件。

2

你不能这样做。 Fork将创建一个新进程,它将复制(或写入时复制)内存页到新进程中。这意味着你的每个子进程都会得到他们自己的“k”副本,每个“k”副本只会增加一次。

要让所有进程回传给“相同”k变量,您需要执行某种进程间通信。良好的进程间通信的

实例:

  1. 有父进程创建,存储k的值的共享存储器段。让子进程等待独占内存段的共享(通过父进程创建的互斥锁)。当孩子拥有排他锁时,让孩子读取k的值并存储k + 1的值。

  2. 在父进程和子进程之间创建每个进程管道。让父母读取管道中的消息,表明想要增加k。让父进程代表孩子增加k值。差进程间通信的

实例:

  1. 任何溶液,其未能确保以K变化是原子(意思是两个争孩子可能既增量K至相同的值)。这种缺乏照顾会导致K的值似乎增加的次数少于子过程的次数,因为设定值可能看起来像(2,3,4,5)。这意味着文件I/O几乎是无用的,除非你创建一个框架来确保原子操作锁定文件以进行独占访问。
0

子进程得到一个副本的父母地址空间。换句话说,每个子进程都有自己的全局变量副本。

您需要将变量放在共享内存映射中,以允许所有子进程和父进程共享相同的变量。

1

按定义进程无法直接修改其他进程的资源(如全局变量等)。你想要使用线程而不是进程。看看pthread_create(3)或克隆(2)