Linux进程间通信之共享内存(Share Memory)
共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式。两个不同进程A、B共享内存的意思是,同一块物理内存被映射到进程A、B各自的进程地址空间。进程A可以即时看到进程B对共享内存中数据的更新,反之亦然。由于多个进程共享同一块内存区域,必然需要某种同步机制,互斥锁和信号量都可以。采用共享内存通信的一个显而易见的好处是效率高,因为进程可以直接读写内存,而不需要任何数据的拷贝。因此,采用共享内存的
共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式。两个不同进程A、B共享内存的意思是,同一块物理内存被映射到进程A、B各自的进程地址空间。进程A可以即时看到进程B对共享内存中数据的更新,反之亦然。由于多个进程共享同一块内存区域,必然需要某种同步机制,互斥锁和信号量都可以。采用共享内存通信的一个显而易见的好处是效率高,因为进程可以直接读写内存,而不需要任何数据的拷贝。因此,采用共享内存的通信方式效率是非常高的。
模板:
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <sys/wait.h>
int main()
{
int shmid;
char *shmaddr_son;shmaddr_father;
pid_t pid;
if(shmid= shmget(IPC_PRIVATE, 512, IPC_CREAT) == -1)
{
exit(1);
}
pid = fork();
if(pid == 0)
{
sleep(2);
shmaddr_son = shmat(mid, NULL, 0);
printf("memory data is %s\n",shmaddr_son);
exit(0);
}else if(pid > 0)
{
shmaddr_father = shmat(shmid, NULL, 0);
strcpy(shmaddr_father, "hello word!!!");
shmdt(shmaddr_father);
wait(NULL);
exit(0);
}else if(pid < 0)
{
perror("fork error!!!");
exit(1);
}
return 0;
}
几个常用函数介绍:
shmget(key_t key,size_t size,int shmflg);
用来开辟/指向一块共享内存的函数.shmget()用来获得共享内存区域的ID,如果不存在指定的共享区域就创建相应的区域。
shmat(int shmid , char *shmaddr , int shmflag );
用来允许本进程访问一块共享内存的函数.
shmid为shmget的返回值
char *shmaddr是共享内存的起始地址,如果shmaddr为0,内核会把共享内存映像到调用进程的地址空间中选定位置;如果shmaddr不为0,内核会把 共享内存映像到shmaddr指定的位置。所以一般把shmaddr设为0。
int shmflag是本进程对该内存的操作模式。如果是SHM_RDONLY的话,就是只读模式。其它的是读写模式
成功时,这个函数返回共享内存的起始地址。失败时返回-1。
shmdt(const void *shmaddr);
删除本进程对这块内存的使用
shmctl( int shmid , int cmd , struct shmid_ds *buf );
int shmid是共享内存的ID。
int cmd是控制命令,可取值如下:
IPC_STAT 得到共享内存的状态
IPC_SET 改变共享内存的状态
IPC_RMID 删除共享内存
struct shmid_ds *buf是一个结构体指针。IPC_STAT的时候,取得的状态放在这个结构体中。如果要改变共享内存的状态,用这个结构体指定。
更多推荐
所有评论(0)