如何使用fork()创建一定数量的子进程

时间:2011-02-16 17:33:22

标签: c process fork

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

使用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;
}

5 个答案:

答案 0 :(得分:2)

你不能以这种方式做到这一点。 Fork将创建一个新进程,该进程将内存页面复制(或写入时复制)到新进程中。这意味着您的每个子进程都将获得自己的“k”副本,而“k”的每个副本只会增加一次。

要让所有进程与“同一”k变量进行通信,您需要执行某种进程间通信。

良好的进程间通信示例:

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

  2. 在父级子进程之间创建每进程管道。让父母读取管道以获得表示希望增加k的消息。让父进程代表孩子增加k。

  3. 糟糕的进程间通信的例子:

    1. 任何无法确保K中的变化都是原子的解决方案(意味着两个竞争的孩子可能都将K增加到相同的值)。这种缺乏关注会导致K值似乎增加的次数少于子进程数,因为设置值可能看起来像(2,3,3,4,5)。这意味着文件i / o几乎是无用的,除非你在它周围创建一个框架,以确保锁定文件以进行独占访问的原子操作。

答案 1 :(得分:2)

正如Kevin评论的那样,你真正想要的是线程。 为此做IPC是矫枉过正的。 请看以下链接。

http://www.yolinux.com/TUTORIALS/LinuxTutorialPosixThreads.html

答案 2 :(得分:1)

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

答案 3 :(得分:1)

根据定义,流程不能直接修改其他流程(例如全局变量等)的资源。您希望为此使用线程而不是进程。查看pthread_create(3)或clone(2)

答案 4 :(得分:0)

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

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