首页 文章

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

提问于
浏览
4

我需要创建一定数量的并发子进程 . 我还希望每个子进程都修改一个全局变量,以便主父进程可以在其上一个修改版本中打印它 . 当我运行下面的程序时,'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 回答

  • 1

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

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

  • 1

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

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

    良好的进程间通信示例:

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

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

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

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

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

  • 0

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

  • 2

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

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

相关问题