我正在尝试将(循环)队列(在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()等创建/附加/检索/删除队列数据结构的共享内存的任何代码片段/示例都将是一个很好的帮助。
答案 0 :(得分:4)
这是一个简单的示例,它创建一个结构大小的共享内存,将一些数据写入并打印出来。运行一个实例,它将创建共享内存并在其中放入一些“数据”,然后等待按键。在另一个命令提示符下运行第二个实例,第二个实例将打印内存的内容。
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;
}
答案 1 :(得分:3)
当我搞乱Unix IPC时,我跟着Beej's guide to Unix IPC。它甚至还有一些笑话!您可以直接转到shared memory section。它包含解释每个步骤的片段,以及最后的完整示例。