使用"shm_open"分配的共享内存,"ftruncate"未按指定分配



我使用以下代码来理解Linux上的共享内存:

#include <sys/types.h>
#include <sys/mman.h>
#include <err.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
int main(void)
{
const char str1[] = "string 1";
const char str2[] = "string 2";
pid_t parpid = getpid(), childpid;
int fd = -1;
char *anon, *zero;
if((fd = shm_open("/mmap_test", O_CREAT | O_RDWR, S_IRUSR | S_IWUSR)) == -1)
err(1, "shm_open");
printf("created shared memory filen");
if(ftruncate(fd, 1024) != 0) err(1,"ftruncate");
anon = (char*)mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_ANON|MAP_SHARED, -1, 0);
zero = (char*)mmap(NULL, 1024, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if (anon == MAP_FAILED)
errx(1, "anon mmap");
if (zero == MAP_FAILED)
errx(1, "zero mmap"); 
strcpy(anon, str1);
strcpy(zero, str1);
printf("PID %d:tanonymous %s, zero-backed %sn", parpid, anon, zero);
switch ((childpid = fork())) {
case -1:
err(1, "fork");
/* NOTREACHED */
case 0:
childpid = getpid();
printf("PID %d:tanonymous %s, zero-backed %sn", childpid, anon, zero);
sleep(3);
printf("PID %d:tanonymous %s, zero-backed %sn", childpid, anon, zero);
munmap(anon, 4096);
munmap(zero, 1024);
close(fd);
return EXIT_SUCCESS;
}
sleep(2);
strcpy(anon, str2);
strcpy(zero, str2);
printf("PID %d:tanonymous %s, zero-backed %sn", parpid, anon, zero);
munmap(anon, 4096);
munmap(zero, 1024);
sleep(3);
close(fd);
return EXIT_SUCCESS;
}

我的建筑命令如下:

g++ -lpthread -lrt mmap_test.cpp

其中";mmap_test";是我的cpp文件的名称。在此代码中,共享内存对象由
fd = shm_open("/mmap_test", O_CREAT | O_RDWR, S_IRUSR | S_IWUSR)创建,其大小由ftruncate(fd, 1024)修改。文件被映射到zero = (char*)mmap(NULL, 1024, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);中的一个指针。

基本上,我尝试使用ftruncate修改共享对象的大小。我尝试了不同的大小(代码中的1024只是一个实例),当我检查文件/dev/shm/mmap_test时,我发现它总是4.0 KB,使用命令ls -sh /dev/shm/mmap_test。我只能将这个4.0K与Linux上的页面大小联系起来。有人能解释一下为什么实际尺寸没有按照代码中的规定吗?

对象大小受体系结构提供的粒度限制,并在内核中实现。在您的案例中,4k似乎就是这种粒度;这将对应于x86 cpu中的基本页面大小。

最新更新