unix环境编程卷2之Posix共享内存区

Posix.1提供两种无亲缘关系进程间共享内存区的方法:

内存映射文件:open函数打开,mmap函数把得到的描述符映射到当前进程地址空间的一个文件

共享内存区对象:shm_open打开一个Posix.1 IPC名字,返回的描述符由mmap函数映射到当前进程的地址空间

两种技术的差别在于:作为mmap参数之一的描述符通过open或者shm_open获取


Posix共享内存涉及两个步骤要求:

1.      指定一个名字参数调用shm_open,以创建一个新的共享内存区对象或打开一个已经存在的共享内存区对象

2.      调用mmap把共享内存区映射到调用进程的地址空间

#include intshm_open(const char *name, into flag, mode_t mode); int shm_unlink(const char*name);

oflag参数必须或含O_RDONLY,或含O_RDWR,还可以指定O_CREAT|O_EXCL|O_TRUNC。如果含O_RDWR指定O_TRUNC,而且所需的共享内存区对象已经存在,将被截短成0长度。

注意:shm_open(RD_ONLY) 对应于mmap(PROT_READ)

Posix共享内存区具有随内核的持续性,程序的终止不会删除共享内存区对象。文件放在/dev/shm目录

 

处理mmap时候,普通文件或共享内存区对象的大小可以通过调用ftruncate修改

#include int ftruncate(intfd, off_t length);  

#include int fstat(fd, struct stat *buf);

1. 对于普通文件:如果文件大小大于length,额外的数据丢弃;否则,文件大小可能扩展到length

2. 对于一个共享内存对象:对象大小设置成length字节

stat结构包含12个或以上成员,然而当fd指代一个共享内存区对象,只有st_mode st_uid st_gid st_size含有信息

共享内存对象在父子进程中被内存映射到不同的起始地址。即使同一个共享内存对象指针在父子进程内有不同的起始地址,然而都指向同一共享内存区,一个进程对指针进行的操作在其它进程内是可见的。

一般规则:我们应该把持有某个互斥锁期间执行的代码编写得操作总数尽量地少。

sem_trywait(&nempty) # 不会阻塞,如果nempty信号量值为0,函数返回一个EAGAIN错误。

你可能感兴趣的:(Posix共享内存区)