父子进程共享内存通信的三种方法

1.  mmap MAP_ANONYMOUS

在支持MAP_ANONYMOUS的系统上,直接用匿名共享内存就可以,

mmap(NULL, sizeof(int), PROT_READ|PROT_WRITE,   MAP_ANONYMOUS|MAP_SHARED, -1, 0);


2. mmap  /dev/zero

       有些系统不支持匿名内存映射,则能够使用fopen打开/dev/zero文件,然后对该文件进行映射。能够相同达到匿名内存映射的效果。

fd=open("/dev/zero",O_RDWR);
if(fd==-1){
	printf("open /dev/zero null\n");
	return -1;
}
addr=mmap(NULL,sizeof(int),PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
if(addr == NULL){
    printf("mmap error\n");
    return -1;
}


3. shmget shmat shmctl

shmget 是老式的system V 共享内存模式,非常多系统都支持这样的方法。

int  id;
//得到一个共享内存标识符或创建一个共享内存对象并返回共享内存标识符
id = shmget(IPC_PRIVATE, shm->size, (SHM_R|SHM_W|IPC_CREAT));
if(id==-1){
    perror("shmget:");
    return -1;
}
//连接共享内存标识符为shmid的共享内存,连接成功后把共享内存区对象映射到调用进程的地址空间。随后可像本地空间一样訪问
addr = shmat(id, NULL, 0);
if(addr == NULL){
    perror("shmat:");
    return -1;
}
//完毕对共享内存的控制
if(shmctl(id, IPC_RMID, NULL)==-1){
    perror("shmctl:");
    return -1;
}

你可能感兴趣的:(父子进程共享内存通信的三种方法)