Tag: 共享内存

共享内存,只读它

我正在阅读beej的共享内存段指南 最后他说: 更常见的情况是,进程将附加到段并运行一段时间,而其他程序正在更改并读取共享段。 看一个进程更新段并看到更改出现在其他进程中是很好的。 同样,为简单起见,示例代码不会这样做,但您可以看到如何在独立进程之间共享数据。 我的问题是:当共享内存是只读时有必要吗?

与struct指针共享内存互斥

我正在寻找一些关于我是否正确执行以下操作的反馈。 我正在努力移植一些Windows实时代码,这些代码大量使用了命名的互斥锁。 它需要一些搜索,但我遇到一些东西,说你可以使用共享内存作为linux中的互斥,使用shm open。 我不能在这里包含所有代码,但我将需要一些反馈的关键区域放在一起。 我的问题是如果我正确设置共享内存区域和互斥锁,以及我的指针是否设置正确,以及如何利用它来锁定/解锁。 volatile struct GenQ { volatile pthread_mutex_t *qMutexId volatile sem_t qSemId volatile int nexton volatile int nextoff } typedef struct Node{ void *qid char shmname[80] sem_t *semid pthread_mutex_t *mutexID struct node *next struct node *prev } void * init (const char *qname) { struct GenQ *myq; char mtxstr[80]; pthread_mutex_t *mutexQueAccess; […]

在ac程序中打印相同的物理地址

有没有办法在这些程序中打印相同的物理地址(使用共享内存概念)而不是打印不同的逻辑地址? 我打印相同物理地址的原因:… / *这是可选的,因为我提供了许多不属于核心的信息* / 在我的实验室中,我有两个程序:一个通过共享内存概念将字符串存储在物理内存中,另一个通过访问共享内存来打印相同的字符串。 计划1: #include #include #include #include #include main() { key_t key; int shmid; char* addr1; key = ftok(“/home/tamil/myc/pws.c”,’T’); shmid = shmget(key,128*1024,IPC_CREAT|SHM_R|SHM_W); addr1 = shmat(shmid,0,0); printf(“\nIPC SHARED MEMORY”); printf(“\n SENDER ADDRESS”); printf(“\nTHE ADDRESS IS %p”,addr1); printf(“\nENTER THE MESSAGE:”); scanf(“%s”,addr1); printf(“\nMESSAGE STORED IN %p IS %s”,addr1,addr1); } 计划2: #include #include #include #include […]

无法增加共享内存的大小

请你帮助我好吗? 我不能增加我的谢尔德记忆的大小。 代码在Linux上用C语言编写。 我需要65536字节,但似乎只允许49152 …如果我增加它,shmget失败…(在我的代码中: shmid < 0 )我试图找出我的最大共享内存大小并增加它: sysctl -w kernel.shmmax=2147483648 但这没有帮助,初始化再次失败。 这是我的代码: #define SHM_KEY 9877 #define SHM_SIZE 65536 int SHM_init (int shmid, char** shm, key_t key, long int size) { /* Create a new (System V) shared memory segment of the specified size */ shmid = shmget(key, SHM_SIZE, IPC_CREAT|0777); /* Check if SHM […]

在C中创建访问共享内存

所以我有一个问题,我真的不知道如何去做。 我希望也许你可以让我知道如何处理它。 我需要在共享内存中分配N个缓冲区。 每个缓冲区应初始化为0.然后我必须分叉N / 2个子进程数。 然后每个孩子(i)将值(i)写入缓冲区(i),睡眠一秒钟。 然后读取当前缓冲区的值,如果值在平均时间内更改,则显示一条消息。 然后孩子移动i-position N / 2次。 So I can have N Buffers = 11. (must be prime) N/2 children = 5. So child 2 would: write into buffer 2, sleep, read from buffer 2. (now move 2 positions) write into buffer 4, sleep, read from buffer 4. (now move […]

使用共享内存和矩阵

我想在共享内存段中创建一个矩阵。 在我的第二个程序中,我可以读取tailleX , tailleY但我的矩阵的值只有’0’。 我在我的函数initialiserSegMem创建我的矩阵,值很好……就像我总是指针有问题… 我的struct mem_share: typedef struct mem_partage{ int** carte; int tailleY; int tailleX; }mem_share; mem_share initialiserDonneeMem(grille* g){ mem_share mem_share_carte; int x = g->tailleX; int y = g->tailleY; int i,j; mem_share_carte.carte = malloc(y*sizeof(int*)); for(i=0;i carte; mem_share_carte.tailleY = y; mem_share_carte.tailleX = x; return mem_share_carte; } void initialiserSegMem(mem_share *mem_share_carte){ int shmid,id_memoire,i,j; int test = 100; […]

什么阻止我阅读/写入比共享内存的大小更远? (System V IPC)

我在做的是: shmget(shm_key, shm_size, 0666 | IPC_CREAT); (当然还附上) 我已经将大小设置为12字节但是当我尝试类似的东西时: sprintf(shm_ptr, “Imagine about 200-300 characters here\n”); 它似乎正常工作没有问题或警告,并检查,我试图从一个完全不同的过程(我分叉和执行第一个)读取它,当然 printf(“%s”, shm_ptr); 打印该段中的消息,该消息应为12字节。 System V IPC是否应该是这样的,并且该问题没有解决方法? 如果是这样,为什么要设置一个尺寸? 感谢您提前的时间和答案。

两个程序共享C内存

我有2个程序作家和读者。 编写器应该创建共享内存,然后将结构数组保存到那段内存中…读者应该使用那段内存并能够输出作者在内存中保存的内容。 我非常努力输出更多,然后只是数组的第一部分,所以我甚至不确定数组是否正确保存到共享内存,所以我说我会在这里发布我的代码,也许有人可以帮助我出… 作家: #include #include #include #include #include #include #include #include #include #include #include “header.h” int main() { key_t key = 1234; int shmid; int i = 0; int p; struct companyInfo * pdata[4]; for (i = 0; i companyName,”AIB”); pdata[0]->sharePrice = 11.2; strcpy(pdata[1]->companyName,”BOI”); pdata[1]->sharePrice = 10.2; strcpy(pdata[2]->companyName,”TSB”); pdata[2]->sharePrice = 9.2; printf(“name is %s […]

shmget无法正常工作

#include #include #include #include #include #include #include int main() { int i=0; int shmid; int *mem=(int*)malloc(10*sizeof(int)); key_t key; key=1234; pid_t pid; shmid=shmget(1234,sizeof(*mem), IPC_CREAT|0666); if(shmid==-1) { printf(“shmget error\n”); return -1; } mem=shmat(shmid, NULL, 0); if(mem==(int*)-1) { printf(“shmat error\n”); return -1; } for(;i<10;i++) { *(mem+i)=0; } pid=fork(); if(pid<0) { fprintf(stderr,"Fork Failed"); printf("array : "); } else if […]

C使用共享内存传递void指针

我需要将void处理程序传递给另一个应用程序,为了复制场景我使用共享内存创建了一个小程序并尝试将void指针传递给另一个应用程序并打印该值,我可以在另一个应用程序中获取void指针地址,但是当我尝试取消引用指针第二个应用程序崩溃时。 以下是示例应用程序wire.c。 #include #include #include int main() { key_t key=1235; int shm_id; void *shm; void *vPtr; shm_id = shmget(key,10,IPC_CREAT | 0666); shm = shmat(shm_id,NULL,NULL); sprintf(shm,”%d”,&vPtr); printf(“Address is %p, Value is %d \n”, (void *)&vPtr, * (int *)vPtr); return; } 这是read.c #include #include #include #include int main() { key_t key=1235; int shm_id; void *shm; void *p […]