当前位置: 技术问答>linux和unix
请问在子进程中变量如何与父进程同步(100)
来源: 互联网 发布时间:2015-09-17
本文导语: 在Socket编程当中,我用Accept等待客户端连接, 如果有联接的话,我会fork()出一个新的进程 我在子进程用到父进程的一个变量,每次加1 但是当我处理完这个子进程之后,父进程的变量却还是0 我如何才能使这个变量...
在Socket编程当中,我用Accept等待客户端连接,
如果有联接的话,我会fork()出一个新的进程
我在子进程用到父进程的一个变量,每次加1
但是当我处理完这个子进程之后,父进程的变量却还是0
我如何才能使这个变量和子进程中的值保持同步
如果有联接的话,我会fork()出一个新的进程
我在子进程用到父进程的一个变量,每次加1
但是当我处理完这个子进程之后,父进程的变量却还是0
我如何才能使这个变量和子进程中的值保持同步
|
父子进程中无论哪个想修改(fork后的第一次)变量,那么系统就会分配新的内存页框给那个进程,拷贝原来的页框内容,然后新页框的内容不修改!所以子进程修改的变量放在新页框力,和父进程是不同地址的。
不过觉得使用通信的方法进行同步有时候不是很灵活,所以还是使用共享的线程好!
不过觉得使用通信的方法进行同步有时候不是很灵活,所以还是使用共享的线程好!
|
办法有很多,比如pipe,管道,共享内存,unix socket等
其实最简单的还是不要fork进程,采用pthread就可以了,但要注意同步问题,使用线程锁
其实最简单的还是不要fork进程,采用pthread就可以了,但要注意同步问题,使用线程锁
|
给你一个在共享内存使用的例子
比如 整数i放在共享内存中
#include
#include
#include
int *i;
int shmid;
shmid = shmget(IPC_PRIVATE, sizeof(int), (SHM_R | SHM_W));
i = shmat(shmid,0,0);
..........
shmctl(shmid,IPC_RMID,0); //回收该区域
比如 整数i放在共享内存中
#include
#include
#include
int *i;
int shmid;
shmid = shmget(IPC_PRIVATE, sizeof(int), (SHM_R | SHM_W));
i = shmat(shmid,0,0);
..........
shmctl(shmid,IPC_RMID,0); //回收该区域
|
UPCC(杂食动物) 言之有理,用户空间的fork 是写时复制的,当要修改数据区时,于是为新fork的子进程分配内存的,所以你修改的变量其实只是子进程中的变量而已,改用THREAD 呀
|
哈哈,跟我今天碰到的问题一样。我本来也想问这个问题。
现在想明白了,父进程和子进程在不同的内存空间,对于一个变量会存储两次。所有要让他们的变量互相使用,只能采用进程间通信,或者线程并行执行。
现在想明白了,父进程和子进程在不同的内存空间,对于一个变量会存储两次。所有要让他们的变量互相使用,只能采用进程间通信,或者线程并行执行。
|
父子进程中无论哪个想修改(fork后的第一次)变量,那么系统就会分配新的内存页框给那个进程,拷贝原来的页框内容,然后新页框的内容被修改!所以子进程修改的变量放在新页框力,和父进程改变量是存放在不同地址的。
不过觉得使用通信的方法进行同步有时候不是很灵活,所以还是使用共享的线程好!
不过觉得使用通信的方法进行同步有时候不是很灵活,所以还是使用共享的线程好!
|
该变量应该放在共享存储区中,子进程与父进程的存储区域不同,子进程的变量改变当然不会影响父进程. 建议在一块共享存储区中放置该变量,就可以保证变量同步