当前位置: 技术问答>linux和unix
linux 共享内存 请教
来源: 互联网 发布时间:2016-11-19
本文导语: 我在程序的一个主进程中用文件映射方式申请了一块共享内存,用于父子进程的交互,代码如下 sh= (shm*) mmap( NULL,sizeof(shm),PROT_READ|PROT_WRITE,MAP_SHARED,fd,0); shm的定义为 typedef struct { int flag; s_map_t *map; char...
我在程序的一个主进程中用文件映射方式申请了一块共享内存,用于父子进程的交互,代码如下
sh= (shm*) mmap( NULL,sizeof(shm),PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
shm的定义为
typedef struct
{
int flag;
s_map_t *map;
char *name;
}shm;
在主进程中给 map和name变量动态的开辟了内存空间,附上初始值。然后主进程调用fork函数产生若干子进程,我想在子进程中改变sh中的成员值,但我子进程发现只能改变flag的值,不能改变另外两个指针的值。 但我把shm中的name定义为 char name[10]的情况下,则子进程可以改变name的值,请问这是怎么回事
sh= (shm*) mmap( NULL,sizeof(shm),PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
shm的定义为
typedef struct
{
int flag;
s_map_t *map;
char *name;
}shm;
在主进程中给 map和name变量动态的开辟了内存空间,附上初始值。然后主进程调用fork函数产生若干子进程,我想在子进程中改变sh中的成员值,但我子进程发现只能改变flag的值,不能改变另外两个指针的值。 但我把shm中的name定义为 char name[10]的情况下,则子进程可以改变name的值,请问这是怎么回事
|
char *name 时,子进程不是不能改变,而是改变之后父进程看不到
因为只有name本身是在共享内存中,为name分配的空间是在堆中
只能被子进程继承,不是父子进程间共享的;子进程中对它的数据的改变是反映不到父进程的
定义为char name[10]时,name本身以及它存放的数据都在共享内存中,父子进程共享
因为只有name本身是在共享内存中,为name分配的空间是在堆中
只能被子进程继承,不是父子进程间共享的;子进程中对它的数据的改变是反映不到父进程的
定义为char name[10]时,name本身以及它存放的数据都在共享内存中,父子进程共享