我需要创建一定数量的并发子进程。我还希望每个子进程都修改一个全局变量,以便主父进程可以在其上一个修改版本中打印它。当我运行下面的程序时,'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;
}
答案 0 :(得分:2)
你不能以这种方式做到这一点。 Fork将创建一个新进程,该进程将内存页面复制(或写入时复制)到新进程中。这意味着您的每个子进程都将获得自己的“k”副本,而“k”的每个副本只会增加一次。
要让所有进程与“同一”k变量进行通信,您需要执行某种进程间通信。
良好的进程间通信示例:
让父进程创建一个存储k值的共享内存段。让子进程等待共享内存段的独占获取(通过父进程创建的互斥锁)。当孩子拥有独占锁时,让孩子读取k的值并存储k + 1的值。
在父级子进程之间创建每进程管道。让父母读取管道以获得表示希望增加k的消息。让父进程代表孩子增加k。
糟糕的进程间通信的例子:
答案 1 :(得分:2)
正如Kevin评论的那样,你真正想要的是线程。 为此做IPC是矫枉过正的。 请看以下链接。
http://www.yolinux.com/TUTORIALS/LinuxTutorialPosixThreads.html
答案 2 :(得分:1)
默认情况下,子进程不能更改父地址空间中的任何内容。您需要共享内存,以及防止竞争条件的互斥机制。
答案 3 :(得分:1)
根据定义,流程不能直接修改其他流程(例如全局变量等)的资源。您希望为此使用线程而不是进程。查看pthread_create(3)或clone(2)
答案 4 :(得分:0)
子进程获得父级地址空间的副本。换句话说,每个子进程都有自己的全局变量副本。
您需要将变量放在共享内存映射中,以允许所有子进程和父进程共享同一个变量。