我一直在尝试 Linux 上的写时复制缓冲区,以下示例似乎按预期工作:
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#define SIZE 4096
#define SHM_NAME "foobar"
int main(void)
{
int fd = shm_open(SHM_NAME, O_RDWR | O_CREAT, 0666);
int r = ftruncate(fd, SIZE);
char *buf1 = mmap(NULL, SIZE, PROT_READ | PROT_WRITE,
MAP_SHARED, fd, 0);
strcpy(buf1, "Original buffer");
char *buf2 = mmap(NULL, SIZE, PROT_READ | PROT_WRITE,
MAP_PRIVATE, fd, 0);
// At this point buf2 is aliased to buf1
// Now modifying buf2 should trigger copy-on-write)...
strcpy(buf2, "Modified buffer");
// buf1 and buf2 are now two separate buffers
strcpy(buf1, "Modified original buffer");
// clean up
r = munmap(buf2, SIZE);
printf("munmap(buf2): %i\n", r);
r = munmap(buf1, SIZE);
printf("munmap(buf1): %i\n", r);
r = shm_unlink(SHM_NAME);
printf("shm_unlink: %i\n", r);
return EXIT_SUCCESS;
}
然而,在OS X(10.10)下,第二个mmap
调用返回MAP_FAILED
,并且errno
= 22(EINVAL
)。OS X mmap
手册页面似乎表明这应该可以工作(它甚至在MAP_PRIVATE
标志的描述中提到了写时复制),我已经尝试使用各种不同的标志调用mmap
,但是没有什么有效。有什么想法吗?
OS X
上使用MAP_PRIVATE
时,无法处理文件描述符。 - l'L'lMAP_SHARED
缓冲区的MAP_PRIVATE
缓冲区,然后通过写时复制重新映射。所以我认为offset
对于两者都需要为0,但我准备尝试任何东西。;-) - Paul Ropen
的示例;似乎使用shm_open
并使用MAP_SHARED
和MAP_PRIVATE
进行别名处理会影响文件描述符。从外观上看,这可能是一个错误。 - l'L'lshm_open
,现在一切都正常了!非常感谢您的帮助 - 如果您愿意,可以将此写成答案,我会点赞/接受它,否则我稍后会为可能将来遇到相同问题的任何人自己完成。 - Paul R