- 论坛徽章:
- 0
|
代码如下:
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
volatile static int g_value = 0xFF;
static int *pbuf =NULL;
void child_task()
{
sleep(10);
while(1){
printf("child task[%d] value:%d address:0x%p,*pbuf = %d\n",getpid(),g_value,&g_value,*pbuf);
sleep(2);
}
exit(0);
}
int main(int argc,char *argv[])
{
pid_t pid = -1;
pbuf = (int *)malloc(4);
*pbuf = 0;
pid = fork();
if(pid == 0){
child_task();
}
while(1){
printf("parent task[%d] value:%d address:0x%p,*pbuf = %d\n",getpid(),g_value,&g_value,*pbuf);
g_value++;
*pbuf = *pbuf +1;
sleep(4);
}
exit(0);
return 0;
}
parent task[2242] value:255 address:0x0x804a024,*pbuf = 0
parent task[2242] value:256 address:0x0x804a024,*pbuf = 1
parent task[2242] value:257 address:0x0x804a024,*pbuf = 2
child task[2243] value:255 address:0x0x804a024,*pbuf = 0
child task[2243] value:255 address:0x0x804a024,*pbuf = 0
parent task[2242] value:258 address:0x0x804a024,*pbuf = 3
child task[2243] value:255 address:0x0x804a024,*pbuf = 0
parent task[2242] value:259 address:0x0x804a024,*pbuf = 4
child task[2243] value:255 address:0x0x804a024,*pbuf = 0
child task[2243] value:255 address:0x0x804a024,*pbuf = 0
parent task[2242] value:260 address:0x0x804a024,*pbuf = 5
child task[2243] value:255 address:0x0x804a024,*pbuf = 0
child task[2243] value:255 address:0x0x804a024,*pbuf = 0
parent task[2242] value:261 address:0x0x804a024,*pbuf = 6
child task[2243] value:255 address:0x0x804a024,*pbuf = 0
child task[2243] value:255 address:0x0x804a024,*pbuf = 0
parent task[2242] value:262 address:0x0x804a024,*pbuf = 7
child task[2243] value:255 address:0x0x804a024,*pbuf = 0
child task[2243] value:255 address:0x0x804a024,*pbuf = 0
parent task[2242] value:263 address:0x0x804a024,*pbuf = 8
child task[2243] value:255 address:0x0x804a024,*pbuf = 0
child task[2243] value:255 address:0x0x804a024,*pbuf = 0
编译运行的环境为Ubuntu 10.04.4 LTS/Linux 2.6.32-38-generic
从log来看 子进程继承了父进程变量以及heap。
根据网上COW的解释,子进程再去写内存的时候才会复制一份父进程的物理内存,如果不写,则子进程的page table表用的是父进程。
现在很困惑,既然以上程序 子进程没有写g_value,按理讲子进程g_value的值应该跟父进程指向同一个物理地址。
或者COW的理解为 只要是父进程或子进程的任何一个去写变量,都会触发copy page table???? |
|