【问题标题】:Designing a Queue to be a shared memory将队列设计为共享内存
【发布时间】:2012-01-18 17:04:58
【问题描述】:

我正在尝试将(循环)队列(在 C 中)设计/实现为共享内存,以便它可以在多个线程/进程之间共享。

队列结构如下:

typedef struct _q {
    int q_size;
    int q_front;
    int q_rear;
    int *q_data;
}queue;

支持以下功能:

int empty_q(queue *q);
int display_q(queue *q);
int create_q(queue **q, int size);
int delete_q(queue **q);
int enqueue(queue *q, int data);
int dequeue(queue *q, int *data);

根据用户提到的队列大小,在create_q()中为q_data分配内存。

问题:如何使用“sys/shm.h”中提供的系统函数为该队列创建共享内存?任何使用 shmget()、shmat()、shmctl() 等为队列数据结构创建/附加/检索/删除共享内存的代码 sn-p/example 都会有很大帮助。

【问题讨论】:

  • 如果你想使用类似队列的机制来通信进程,使用message queues不是更好吗?跨来自同一进程的线程,受临界区保护的标准队列就足够了
  • @dario_ramos 消息队列将是解决此问题的理想解决方案..但我试图举一个使用队列的示例来了解如何将数据结构与共享内存连接。
  • 在那种情况下,当我搞砸了 Unix IPC 时,我关注了Beej's guide to Unix IPC。它甚至有一些笑话!可以直接去shared memory section
  • 我添加了最后一条评论作为答案,因为我检查了该指南,它正是您所需要的

标签: c memory posix shared-memory


【解决方案1】:

这是一个简单的例子,它创建一个结构大小的共享内存,向其中写入一些数据并打印出来。运行一个实例,它将创建共享内存并将一些“数据”放入其中,然后等待按键。在不同的命令提示符下运行第二个实例,第二个实例将打印内存的内容。

typedef struct
   {
   char a[24];
   int i;
   int j;
   } somestruct;


void fillshm(int shmid) {
   somestruct *p;

   if ( (p = shmat (shmid, NULL, 0)) < 0 )
      {
      perror("shmat");
      exit(1);
      }

   printf("writing to shared memory\n");
   strcpy(p->a, "my shared memory");
   p->i = 123;
   p->j = 456;
}


void printshm(int shmid)
{
   somestruct *p;
   if ( (p = shmat (shmid, NULL, 0)) < 0 )
      {
      perror("shmat");
      exit(1);
      }

   printf( "%s, %d, %d\n", p->a, p->i, p->j );
}

int main( int argc, char *argv[] ) {

   int shmid;

   // see if the memory exists and print it if so
   if ( (shmid = shmget (1234, 0, 0)) >= 0 )
      printshm( shmid );
   else
      {
      // didn't exist, so create it
      if ( (shmid = shmget (1234, sizeof( somestruct ), IPC_CREAT | 0600)) < 0 )
         {
         perror("shmget");
         exit(1);
         }

      printf( "shmid = %d\n", shmid );

      fillshm(shmid);
      printf( "Run another instance of this app to read the memory... (press a key): " );
      getchar();

      // delete it
      if ( shmctl (shmid, IPC_RMID, NULL) < 0 )
         {
         perror("semctl");
         exit(1);
         }
      }

   return 0;
}

【讨论】:

  • 感谢您的示例。这是正确的(但不完整)。关于如何将结构附加/关联到共享内存的任何想法?
  • @SangeethSaravanaraj:将内存分配给指向结构的指针。与 malloc 调用的内存相同。您需要确保每个进程具有相同的结构定义(具有相同的包装)。
  • @SangeethSaravanaraj:为了好玩,我更新了示例以使用结构并稍微更有趣(允许两个实例运行两个实例,一个填充内存,另一个打印它)。跨度>
  • 感谢您的努力。你的代码 sn-p 给了我一些很好的提示来完成我的任务。 +1
【解决方案2】:

当我搞砸 Unix IPC 时,我关注了Beej's guide to Unix IPC。它甚至有一些笑话!你可以直接去shared memory section。它有 sn-ps 解释每个步骤,最后是一个完整的例子。

【讨论】:

  • Beej 的指南很棒。感谢分享。 :)
  • 我也提到了这个kohala.com/start/unpv22e/unpv22e.chap12.pdf> .. 比较好的信息。
  • 看起来更详细的参考资料,对你有好处。一个小细节:从链接中删除“”,否则它将不起作用(我可以看到文档,因为我编辑了 URL)
猜你喜欢
  • 1970-01-01
  • 2011-07-22
  • 1970-01-01
  • 1970-01-01
  • 2020-11-10
  • 1970-01-01
  • 2013-11-18
  • 2010-12-30
  • 2019-05-01
相关资源
最近更新 更多