使用 System V 共享内存 IPC 需要调用以下两个函数:
int shmget(key_t key, size_t size, int shmflg);
void *shmat(int shmid, const void *shmaddr, int shmflg);
为什么它们被设计成独立的,而不是有一个接受这些参数的函数,执行两个函数并简单地返回地址?
我们可以将文件视为类比。open
在一个字符串(文件路径)上给我们一个文件描述符,我们用它来读/写文件。完成后我们close
在文件描述符上。这种设计看起来很自然,我们不必open
用字符串来获取描述符,然后再去attach
描述符。
作为我想到的一个例子,看看FreeBSD sendmail shared memory implementation。
这种分离(shm_open
和mmap
)也存在于 POSIX 共享内存中,但原因是在实现mmap
之前存在shm_open
并且可以重用,并且mmap
需要描述符(来源:UNIX Network Programming Vol. 2, R. Stevens, Chapter 13, page 326)。