我正在阅读本教科书的POSIX共享内存部分。在我做了一些更改之前,我无法从书中获取代码进行编译。我理解共享内存的想法以及如何打开它,但我仍然对读/写感到困惑。教科书代码显示了一个hello world字符串示例,但我不确定如何将它应用于整数,数组,结构等。这是我正在使用的教科书代码。这是写作。
const int SIZE = 4096;
const char *name = "OS";
const char *message_0 = "Hello";
const char *message_1 = "World!";
int shm_fd;
void *ptr;
shm_fd = shm_open(name, O_CREAT | O_RDWR, 0666);
ftruncate(shm_fd, SIZE);
ptr = mmap(0, SIZE, PROT_WRITE, MAP_SHARED, shm_fd, 0);
//sprintf(ptr, "%s", message_0); //non working text book code
sprintf((char*)ptr, "%s", message_0); //my change to get it to work
ptr += strlen(message_0);
//sprintf(ptr, "%s", message_1);
sprintf((char*)ptr, "%s", message_1);
ptr += strlen(message_1);
这是阅读。
const int SIZE = 4096;
const char *name = "OS";
int shm_fd;
void *ptr;
shm_fd = shm_open(name, O_RDONLY, 0666);
ptr = mmap(0, SIZE, PROT_READ, MAP_SHARED, shm_fd, 0);
printf("%s", (char*)ptr);
shm_unlink(name);
我尝试将其更改为写入/读取整数,但我无法使其工作。我的印象是我应该能够做一些事情,比如:
*ptr = 2;
ptr++;
但是,我无法得到这个,或者我试图工作的任何其他方式。谁能更好地解释一下?感谢。
答案 0 :(得分:2)
您可以将mmap结果转换为int *或double *或任何您喜欢的结果。您可以做的一件事是将结构重叠到共享内存上:
struct MyStruct
{
int s_int;
char s_str[64];
};
void* mem = mmap ...
struct MyStruct* sp = (struct MyStruct*)mem;
/* writing */
sp->s_int = 3;
strcpy(sp->s_str, "Hello");
/* reading */
printf("s_int=%d, s_str=%s\n", sp->s_int, sp->s_str);