进程间的通信
共享内存
是被多个进程共享的一部分物理内存.共享内存是进程间共享数据的一种最快的方法,一个进程向共享内存区域写入了数据,共享这个内存区域的所有进程就可以立刻看到其中的内容.
共享内存实现分为两个步骤:
1、创建共享、打开共享内存,使用shmget函数
2、映射共享内存,将这段创建的共享内存映射到具体的进程空间去,使用shmat函数
3. 分离共享内存
4. 控制、删除共享内存
创建shmget:
函数的作用:在内核中创建共享内存
函数的原型:int shmget(key_t key,int size,int shmflag);
函数的参数:key:键值,IPC_PRIVATE:私有的键值
size:创建的内存大小
shmflag:类似open权限
返 回 值:成功共享的内存标识符,出错 -1
头 文 件:#include <sys/ipc.h>
#include <sys/shm.h>
映射shmat:
函数的作用:映射共享内存,映射到各自的内存空间;
函数的原型:void * shmat(int shmat,const void * shmaddr,int flag);
函数的参数:shmid:内存标识符
shmaddr:映射共享内存到本地进程的指定地址,如果为NULL则由内核自动
分配。
shmflag:SHM_RDONLY:共享内存只读;
0:共享内存可读写
分离shmdt:
函数的作用:撤销共享内存的映射
函数的原型:int shmdt(const void * shmaddr);
函数的参数:shmaddr:被映射的共享内存地址
返 回 值:成功:0 出错:-1
使用共享内存实现通信:
shm1.c:
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include "shm_com.h"
int main(void)
{
int running=1;
void *shared_memory=(void *)0;
struct shared_use_st *shared_stuff;
int shmid;
/*创建共享内存*/
shmid=shmget((key_t)1234,sizeof(struct shared_use_st),0666|IPC_CREAT);
if(shmid==-1)
{
fprintf(stderr,"shmget failed\n");
exit(EXIT_FAILURE);
}
/*映射共享内存*/
shared_memory=shmat(shmid,(void *)0,0);
if(shared_memo