我正在尝试将(循环)队列(在C中)设计/实现为共享内存,以便可以在多个线程/进程之间共享它。
队列结构如下:
typedef struct _q { int q_size; int q_front; int q_rear; int *q_data; }queue;
它支持以下function:
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指南 。 它甚至有一些笑话! 您可以直接转到共享内存部分 。 它包含解释每个步骤的片段,以及最后的完整示例。
下面是一个简单的示例,它创建一个结构大小的共享内存,将一些数据写入并打印出来。 运行一个实例,它将创建共享内存并在其中放入一些“数据”,然后等待按键。 在另一个命令提示符下运行第二个实例,第二个实例将打印内存的内容。
需要了解更多c/c++开发分享将队列设计为共享内存,也可以关注C/ C++技术分享栏目—计算机技术网(www.ctvol.com)!
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 memoryn"); 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, %dn", 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 = %dn", 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; }
以上就是c/c++开发分享将队列设计为共享内存相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/980504.html