进程通信之共享内存

来源:互联网 发布:苹果手机相机软件 编辑:程序博客网 时间:2024/05/23 19:24

一 共享内存:多个进程共享的一部分物理内存。一个进程向共享内存写入数据,共享这个内存区域的所有进程就可以立刻看见其中数据。

1,共享内存的实现:创建共享内存,映射共享内存(将这段创建的共享内存映射到具体的进程空间去)

创建一个共享内存:

int shmget(key_t key, int size, int shmflg)

key:

1,0/IPC_PRIVATE:当key取值为IPC_PRIVATE,则函数shmget()将创建一块新的共享内存;如果key'取值为0,而参数shmflg中有设置IPC_PRIVATE,则同样会创建一块新的共享内存。

2,大于0的32位整数,视参数shmflg来确定

SIZE:

1,大于0的整数,新建的共享内存大小,以字节为单位0;

2,只获取共享内存时指定为0;

shmflg:

模式标志参数,使用时需要与IPC对象存取权限(0666) |  运算来确定共享内存的存取权限

映射共享内存:

void* shmat(int shmid, char *shmaddr, int flag)

1,shm_id是由shmget函数返回的共享内存标识

2,shm_addr指定共享内存连接到当前进程中的地址位置,通常为空,标识让系统来选择共享内存的地址

3,shm_flg是一组标志位,通常为0.

成功返回共享内存映射到进程中的地址;失败返回-1.


创建一个进程在共享内存中输入数据"hello":

#include <sys/ipc.h>#include <sys/shm.h>#include <sys/types.h>#include <stdio.h>#include <string.h>       typedef struct _shm{int flag;char msg[1024];}SHM;int main(){//创建一个共享内存//int shmget(key_t key, size_t size, int shmflg);int shmid = shmget((key_t)123,sizeof(SHM),0666 | IPC_CREAT);if(shmid == -1){perror("shmget ");return -1;}//将共享内存映射到进程空间//void *shmat(int shmid, const void *shmaddr, int shmflg);SHM* pshm = (SHM*)shmat(shmid, NULL, 0);if(pshm == (SHM *)-1){perror("shmat ");return -1;}strcpy (pshm->msg,"hello");return 0;}
另建一个文件:最后strcpy 用 printf("%s\n",pshm->msg); 替换,先后编译两个程序,后者输出"hello",证明共享内存可以被多个进程享用。
[root@promote 2-共享内存]# gcc 3-共享内存.c [root@promote 2-共享内存]# ./a.out [root@promote 2-共享内存]# gcc 4-共享内存.c [root@promote 2-共享内存]# ./a.out hello
2,解除映射:int shmdt(char *shmaddr);

当一个进程不再需要共享内存时,需要把它从进程地址空间中脱离

参数shmaddr是shmat函数返回的地址指针,调用成功时返回0,失败时返回-1. 
 
该函数用于将共享内存从当前进程中分离。注意,将共享内存分离并不是删除它,只是使该共享内存对当前进程不再可用

3,共享内存的控制:

int shmctl(int shm_id, int command, struct shmid_ds *buf);  

shm_id是shmget函数返回的共享内存的标识符;

command:IPC_RMID 删除共享内存存段

buf 是一个结构体指针,主要配合参数command使用

4,优缺点:

很明显,由于进程可以直接读写内存,所以采用共享内存进行进程间通信的一个优点就是快速、效率高。像我们前面介绍的匿名管道和命名管道通信方式,需要在用户空间和内核空间之间进行数据拷贝,而共享内存通信方式只在内存中操作,要高效得多。

另外一方面,由于多个进程对同一段内存区域都具有读写权限,在共享内存通信中,进程间的同步问题就显得尤为重要。必须保证同一时刻只有一个进程对共享内存进行写操作,否则会导致数据被覆盖。而共享内存通信又没有提供同步机制,需要使用诸如信号量等手段进行同步控制,这又增加了其复杂性。


http://blog.csdn.net/xiejingfa/article/details/50888870 分享一篇博客,转自 上善若水,人淡如菊 的博客。










原创粉丝点击