C 如何创建Posix共享内存以使用integer

C 如何创建Posix共享内存以使用integer,c,shared-memory,C,Shared Memory,以下是我为这项课堂作业所做的一些背景知识。我将有10个程序,它们将使用信号量来同步访问一个共享内存结构,该结构将保存一个整数。此整数将保存当前已读取的文本量。我将如何从我的教科书中获取这个字符串设置,并将其转换为整数 其中9个程序只会增加共享内存的值,然后其中一个程序只会读取共享内存的值供以后使用。“Producer”将是增加共享内存价值的9个程序。“Consumer”将是一个单独的程序,稍后将读取值以执行单独的操作 “使用者”程序将初始化共享内存并将int值设置为0 下面是“Producer”

以下是我为这项课堂作业所做的一些背景知识。我将有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来使用/管理共享变量