共享内存与Posix共享内存技术解析
1. 4.4BSD匿名内存映射
在进行内存映射时,通常需要创建一个文件并写入数据来初始化计数器。不过,当调用 map 的目的是提供一块在 fork 操作中可共享的映射内存时,可根据不同实现简化操作。
1.1 传统方式
传统做法是创建一个文件,写入全0结构来初始化计数器,因为信号量的值会在调用 sem-init 时初始化。写入全0结构比只写入一个整数值0更简单。之后使用基于内存的信号量,调用 sem-init 将其值初始化为1,第二个参数需非零,以表明该信号量在进程间共享。
1.2 4.4BSD匿名内存映射
4.4BSD提供了匿名内存映射,可完全避免创建或打开文件。只需指定标志为 MAP-SHARED | MAP-ANON ,文件描述符 fd 为 -1,偏移量会被忽略,且内存会初始化为0。示例代码如下:
shm liner-map-an0n.c
3 int
4 main(int argc, char **argv)
5 {
6 int i, nloop;
7 int *ptr;
8 sem-t *mutex;
9 if (argc != 2)
10 err-quit("usage: incr-map-anon <#loops>");
11 nloop = atoi(argv[1]);
超级会员免费看
订阅专栏 解锁全文
3945

被折叠的 条评论
为什么被折叠?



