Проектирование очереди в качестве разделяемой памяти - PullRequest
9 голосов
/ 12 декабря 2011

Я пытаюсь спроектировать / реализовать (циклическую) очередь (в 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 () и т. Д. Был бы очень полезен.

Ответы [ 2 ]

4 голосов
/ 12 декабря 2011

Вот простой пример, который создает разделяемую память размером с структуру, записывает в нее некоторые данные и распечатывает их.Запустите один экземпляр, и он создаст разделяемую память и поместит в нее некоторые «данные», а затем дождется нажатия клавиши.Запустите второй экземпляр в другой командной строке, и второй экземпляр напечатает содержимое памяти.

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;
}
3 голосов
/ 12 декабря 2011

Когда я запутался в Unix IPC, я следовал Руководству Beej по Unix IPC .У него даже есть несколько шуток!Вы можете перейти непосредственно к разделу разделяемой памяти .В нем есть фрагменты, объясняющие каждый шаг, и полный пример в конце.

...