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