将队列设计为共享内存[英] Designing a Queue to be a shared memory

本文是小编为大家收集整理的关于将队列设计为共享内存的处理方法,想解了将队列设计为共享内存的问题怎么解决?将队列设计为共享内存问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我正在尝试设计/实施一个(循环)队列(在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);

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

中.

问题:如何使用" sys/shm.h"中提供的系统函数为此队列创建共享内存?任何代码段/示例用于创建/附加/检索/删除使用SHMGET(),SHMAT(),SHMCTL()等的队列数据结构的共享内存,这是一个很好的帮助.

推荐答案

当我与Unix IPC混乱时,我遵循 beej unix ipc beej指南.它甚至有一些笑话!您可以直接转到共享存储器部分.它有摘要解释每个步骤,最后一个完整的示例.

其他推荐答案

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

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;
}

本文地址:https://www.itbaoku.cn/post/359067.html