linux-进程间通信-共享内存
2018-03-30 19:57
267 查看
一、共享内存的概念
共享内存就是在内存上找一块空间,多个进程可以同时使用这块空间来传输数据,这块空间是这几个进程所共享的。
正因为这块空间共享,属于这几个进程中的每一个进程,所以这块内存属于临界资源,使用的时候需要用信号量进行同步控制。
共享内存是最快的一种IPC(进程间通讯方式)。
共享内存在各个进程中都有直接的指针指向开辟内存区域,在访问时当做本进程中的一块内存,直接访问。
二共享内存的实现
进程A、B通过访问内核对象,找到共享区域的首地址。
这块共享区域是共享的,既属于A,也属于B。所以这块内存既在A
中也在B中。
二共享内存的操作
(1)创建或者获取
int shmget(key_t key, size_t size, int shmflg);
成功时返回一个与key相关的共享内存标识符(非负整数),用于后续的共享内存函数。
调用失败返回-1。key 是键值,它有效地为共享内存段命名;size 开辟内存空间的大小;
shmflg是权限标志 shmflg: IPC_CREAT如果存在则获取,如果不存在,则创建。
(2)链接
第一次创建完共享内存时,它还不能被任何进程访问,shmat函数的作用就是用来启动对该共享内存的访问,并把共享内存连接到当前进程的地址空间。
void *shmat(int shm_id, const void *shm_addr, int shmflg);
返回一个指向内存首地址的指针,shm_id是内存标识符;shm_addr指定共享内存连接到当前进程中的地址位置,通常为空,表示让系统来选择共享内存的地址;shm_flg是一组标志位,通常为0。
(3)断开链接
该函数用于将共享内存从当前进程中分离。不会将共享内存删除,只是使该共享内存对当前进程不再可用。
int shmdt(void *ptr);
ptr是shmat函数返回的地址指针,调用成功时返回0,失败时返回-1.
(4)删除内核对象
int shmctl(int shm_id, int command, struct shmid_ds *buf);
command是要采取的操作,它可以取下面的三个值:
IPC_STAT:把shmid_ds结构中的数据设置为共享内存的当前关联值,即用共享内存的当前关联值覆盖shmid_ds的值。
IPC_SET:如果进程有足够的权限,就把共享内存的当前关联值设置为shmid_ds结构中给出的值
IPC_RMID:删除共享内存段
buf是一个结构指针,它指向共享内存模式和访问权限的结构。这个结构如下
shmid_ds结构至少包括以下成员
struct
4000
shmid_ds
{ uid_t shm_perm.uid;
uid_t shm_perm.gid;
mode_t shm_perm.mode;
};
四共享内存的实现
共享内存就是在内存上找一块空间,多个进程可以同时使用这块空间来传输数据,这块空间是这几个进程所共享的。
正因为这块空间共享,属于这几个进程中的每一个进程,所以这块内存属于临界资源,使用的时候需要用信号量进行同步控制。
共享内存是最快的一种IPC(进程间通讯方式)。
共享内存在各个进程中都有直接的指针指向开辟内存区域,在访问时当做本进程中的一块内存,直接访问。
二共享内存的实现
进程A、B通过访问内核对象,找到共享区域的首地址。
这块共享区域是共享的,既属于A,也属于B。所以这块内存既在A
中也在B中。
二共享内存的操作
(1)创建或者获取
int shmget(key_t key, size_t size, int shmflg);
成功时返回一个与key相关的共享内存标识符(非负整数),用于后续的共享内存函数。
调用失败返回-1。key 是键值,它有效地为共享内存段命名;size 开辟内存空间的大小;
shmflg是权限标志 shmflg: IPC_CREAT如果存在则获取,如果不存在,则创建。
(2)链接
第一次创建完共享内存时,它还不能被任何进程访问,shmat函数的作用就是用来启动对该共享内存的访问,并把共享内存连接到当前进程的地址空间。
void *shmat(int shm_id, const void *shm_addr, int shmflg);
返回一个指向内存首地址的指针,shm_id是内存标识符;shm_addr指定共享内存连接到当前进程中的地址位置,通常为空,表示让系统来选择共享内存的地址;shm_flg是一组标志位,通常为0。
(3)断开链接
该函数用于将共享内存从当前进程中分离。不会将共享内存删除,只是使该共享内存对当前进程不再可用。
int shmdt(void *ptr);
ptr是shmat函数返回的地址指针,调用成功时返回0,失败时返回-1.
(4)删除内核对象
int shmctl(int shm_id, int command, struct shmid_ds *buf);
command是要采取的操作,它可以取下面的三个值:
IPC_STAT:把shmid_ds结构中的数据设置为共享内存的当前关联值,即用共享内存的当前关联值覆盖shmid_ds的值。
IPC_SET:如果进程有足够的权限,就把共享内存的当前关联值设置为shmid_ds结构中给出的值
IPC_RMID:删除共享内存段
buf是一个结构指针,它指向共享内存模式和访问权限的结构。这个结构如下
shmid_ds结构至少包括以下成员
struct
4000
shmid_ds
{ uid_t shm_perm.uid;
uid_t shm_perm.gid;
mode_t shm_perm.mode;
};
四共享内存的实现
相关文章推荐
- 深入理解Linux进程间通信(IPC)-- Posix共享内存
- Linux环境进程间通信(五): 共享内存(上)
- linux 进程间通信 共享内存
- Linux环境进程间通信: 共享内存
- Linux环境进程间通信(五): 共享内存(上)
- Linux环境进程间通信(五): 共享内存(下)
- Linux进程间通信--信号,管道,消息队列,信号量,共享内存,socket
- Linux 进程间通信 - 共享内存shmget方式
- Linux进程间通信(五): 共享内存(上)
- Linux环境进程间通信(五): 共享内存(上)
- (转)Linux环境进程间通信系列(五):共享内存
- linux进程间通信之共享内存
- Linux环境进程间通信: 共享内存
- Linux环境进程间通信(五): 共享内存(上)
- Linux---进程间通信之————共享内存
- Linux进程间通信源码剖析,共享内存(shmget函数详解)
- Linux环境进程间通信(五): 共享内存(下)
- Linux进程间通信--进程,信号,管道,消息队列,信号量,共享内存
- Linux进程间通信-共享内存
- Linux环境进程间通信(五): 共享内存(上)