IPC之共享内存
头文件: sys/shm.h
ipcs -m #查看共享内存状况
1、共享内存的创建
shmget 函数
同一段内存被不同进程共享
但是共享内存并不提供同步机制
需要信号量等加以辅助
int shmget(key_t key, size_t size,int shmflg)
@key IPC_PRIVATE 只属于创建进程 一般不会用 用的是(key_t)1234 不同的进程使用同一个key来连接同一个共享内存
@size 内存容量大小
@shmflg 文件打开权限mode 0666|IPC_CREAT
不相关的进程可以通过该函数的返回值访问同一共享内存
2、shmat函数
第一次创建完共享内存时,它还不能被任何进程访问,shmat函数的作用就是用来启动对该共享内存的访问
并把共享内存连接到当前进程的地址空间
void * shmat(int shm_id, const void *shm_addr,int shmflg)
@shm_id 是由shmget返回的共享内存标识
@shm_addr 指定共享内存连接到当前进程中的地址位置,通常为空,表示让系统来选择共享内存的地址
@shmflg 一组标志位,通常为0
调用成功时,返回一个指向共享内存第一个字节的指针,如果调用失败返回-1
3、shmdt函数
该函数用于将共享内存从当前进程中分离。注意,将共享内存分离,并不是删除它,而是当前进程不能再使用该共享内存
int shmdt(const void *shmaddr)
参数shmaddr是shmat函数返回的地址指针,调用成功时返回0,失败返回-1
4、shmctl函数
与信号量的semctl函数一样,用来控制共享内存
int shmctl(int shm_id,int cmd,struct shmid_ds *buf)
第一个参数 shm_id是shnmget函数返回的共享内存标识
第二个参数 cmd是要采用的操作,可以取下面三个值:
IPC_STAT 把shmid_ds 结构中的数据设置为共享内存的当前关联值,即用共享内存的当前关联值覆盖shmid_ds的值
IPC_SET 如果进程有足够的权限,就把共享内存的当前关联值设置为shmid_ds结构中给出的值
IPC_RMID 删除共享内存段
第三个参数 buf是一个结构指针,它指向共享内存模式和访问权限的结构
shmid_ds结构至少包括以下成员
struct shmid_ds
{
uid_t shm_perm.uid;
uid_t shm_perm.gid;
mode_t shm_perm.mode;
};
5、使用共享内存进行进程间通信
生产者消费者案例
ipcs -m #查看共享内存状况
1、共享内存的创建
shmget 函数
同一段内存被不同进程共享
但是共享内存并不提供同步机制
需要信号量等加以辅助
int shmget(key_t key, size_t size,int shmflg)
@key IPC_PRIVATE 只属于创建进程 一般不会用 用的是(key_t)1234 不同的进程使用同一个key来连接同一个共享内存
@size 内存容量大小
@shmflg 文件打开权限mode 0666|IPC_CREAT
不相关的进程可以通过该函数的返回值访问同一共享内存
2、shmat函数
第一次创建完共享内存时,它还不能被任何进程访问,shmat函数的作用就是用来启动对该共享内存的访问
并把共享内存连接到当前进程的地址空间
void * shmat(int shm_id, const void *shm_addr,int shmflg)
@shm_id 是由shmget返回的共享内存标识
@shm_addr 指定共享内存连接到当前进程中的地址位置,通常为空,表示让系统来选择共享内存的地址
@shmflg 一组标志位,通常为0
调用成功时,返回一个指向共享内存第一个字节的指针,如果调用失败返回-1
3、shmdt函数
该函数用于将共享内存从当前进程中分离。注意,将共享内存分离,并不是删除它,而是当前进程不能再使用该共享内存
int shmdt(const void *shmaddr)
参数shmaddr是shmat函数返回的地址指针,调用成功时返回0,失败返回-1
4、shmctl函数
与信号量的semctl函数一样,用来控制共享内存
int shmctl(int shm_id,int cmd,struct shmid_ds *buf)
第一个参数 shm_id是shnmget函数返回的共享内存标识
第二个参数 cmd是要采用的操作,可以取下面三个值:
IPC_STAT 把shmid_ds 结构中的数据设置为共享内存的当前关联值,即用共享内存的当前关联值覆盖shmid_ds的值
IPC_SET 如果进程有足够的权限,就把共享内存的当前关联值设置为shmid_ds结构中给出的值
IPC_RMID 删除共享内存段
第三个参数 buf是一个结构指针,它指向共享内存模式和访问权限的结构
shmid_ds结构至少包括以下成员
struct shmid_ds
{
uid_t shm_perm.uid;
uid_t shm_perm.gid;
mode_t shm_perm.mode;
};
5、使用共享内存进行进程间通信
生产者消费者案例