C 如何创建Posix共享内存以使用integer
以下是我为这项课堂作业所做的一些背景知识。我将有10个程序,它们将使用信号量来同步访问一个共享内存结构,该结构将保存一个整数。此整数将保存当前已读取的文本量。我将如何从我的教科书中获取这个字符串设置,并将其转换为整数 其中9个程序只会增加共享内存的值,然后其中一个程序只会读取共享内存的值供以后使用。“Producer”将是增加共享内存价值的9个程序。“Consumer”将是一个单独的程序,稍后将读取值以执行单独的操作 “使用者”程序将初始化共享内存并将int值设置为0 下面是“Producer”程序,它将构建并写入共享内存结构C 如何创建Posix共享内存以使用integer,c,shared-memory,C,Shared Memory,以下是我为这项课堂作业所做的一些背景知识。我将有10个程序,它们将使用信号量来同步访问一个共享内存结构,该结构将保存一个整数。此整数将保存当前已读取的文本量。我将如何从我的教科书中获取这个字符串设置,并将其转换为整数 其中9个程序只会增加共享内存的值,然后其中一个程序只会读取共享内存的值供以后使用。“Producer”将是增加共享内存价值的9个程序。“Consumer”将是一个单独的程序,稍后将读取值以执行单独的操作 “使用者”程序将初始化共享内存并将int值设置为0 下面是“Producer”
#include <stdio.h>
#include <stlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/shm.h>
#include <sys/stat.h>
int main()
{
/* the size (in bytes) of shared memory object */
const int SIZE 4096;
/* name of the shared memory object */
const char *name = "OS";
/* strings written to shared memory */
const char *message 0 = "Hello";
const char *message 1 = "World!";
/* shared memory file descriptor */
int shm fd;
/* pointer to shared memory obect */
void *ptr;
/* create the shared memory object */
shm fd = shm open(name, O CREAT | O RDRW, 0666);
/* configure the size of the shared memory object */
ftruncate(shm fd, SIZE);
/* memory map the shared memory object */
ptr = mmap(0, SIZE, PROT WRITE, MAP SHARED, shm fd, 0);
/* write to the shared memory object */
sprintf(ptr,"%s",message 0);
ptr += strlen(message 0);
sprintf(ptr,"%s",message 1);
ptr += strlen(message 1);
return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
int main()
{
/*共享内存对象的大小(字节)*/
常量int大小4096;
/*共享内存对象的名称*/
const char*name=“OS”;
/*写入共享内存的字符串*/
const char*message 0=“你好”;
const char*message 1=“世界!”;
/*共享内存文件描述符*/
int-shm-fd;
/*指向共享内存对象的指针*/
无效*ptr;
/*创建共享内存对象*/
shm fd=shm open(名称,O CREAT | O RDRW,0666);
/*配置共享内存对象的大小*/
ftruncate(shm fd,尺寸);
/*内存映射共享内存对象*/
ptr=mmap(0,大小,保护写入,映射共享,shm fd,0);
/*写入共享内存对象*/
sprintf(ptr,“%s”,消息0);
ptr+=strlen(消息0);
sprintf(ptr,“%s”,消息1);
ptr+=strlen(消息1);
返回0;
}
下面是将从共享内存中读取的“消费者”程序
#include <stdio.h>
#include <stlib.h>
#include <fcntl.h>
#include <sys/shm.h>
#include <sys/stat.h>
int main()
{
/* the size (in bytes) of shared memory object */
const int SIZE 4096;
/* name of the shared memory object */
const char *name = "OS";
/* shared memory file descriptor */
int shm fd;
/* pointer to shared memory obect */
void *ptr;
/* open the shared memory object */
shm fd = shm open(name, O RDONLY, 0666);
/* memory map the shared memory object */
ptr = mmap(0, SIZE, PROT READ, MAP SHARED, shm fd, 0);
/* read from the shared memory object */
printf("%s",(char *)ptr);
/* remove the shared memory object */
shm unlink(name);
return 0;
}
#包括
#包括
#包括
#包括
#包括
int main()
{
/*共享内存对象的大小(字节)*/
常量int大小4096;
/*共享内存对象的名称*/
const char*name=“OS”;
/*共享内存文件描述符*/
int-shm-fd;
/*指向共享内存对象的指针*/
无效*ptr;
/*打开共享内存对象*/
shm fd=shm open(名称,仅限ORD,0666);
/*内存映射共享内存对象*/
ptr=mmap(0,大小,保护读取,地图共享,shm fd,0);
/*从共享内存对象读取*/
printf(“%s”,(char*)ptr);
/*删除共享内存对象*/
shm取消链接(名称);
返回0;
}
我对如何改变这一点的想法是最终对制作人进行以下更改
- 将Int的大小更改为4字节
- 从共享内存中读取int的值,并将该值分配给shmValue
- shmValue然后递增
- shmValue然后被写回共享内存
- 将Int的大小更改为4字节
- 将共享内存初始化为int,值为0
- 将共享内存读取到shmValue
- 然后将shmValue用于以后的操作
再一次,伙计们,我将非常感谢在处理这个问题上的帮助,我正在理解如何使用这项技术。提前谢谢你的帮助 问题在第一段内。这些变化真的是我所要做的全部吗?因为我对此有点模糊。我不太了解共享内存的大部分主题以及代码是如何工作的。我已经浏览了手册页,我想我真的不明白如何通过上面的设置来更改它。但是,为了拥有一个全局共享变量(在您的例子中是一个全局共享内存),您可以在其中一个文件中声明这个变量(比如
int shared;
)。在其他文件中,您可以使用extern int shared重复使用相同的变量代码>。您必须非常注意同步对该变量的访问(互斥、信号量等)。但是,考虑使用<代码> pWords>代码>,程序似乎不是为共享内存的并发访问而设计的。您应该添加一个互斥来防止竞争条件。否则,继续编写代码。然后问问你面临的问题。(相关:)对于我想要设置的内容(例如在sem_open()和mmap()中),每个内容的权限是否正确?我是否必须将使用者程序也更改为读写,以便我可以初始化integer的值?建议:从阅读此内容开始,然后学习如何使用互斥和sem来使用/管理共享变量