Tag: 共享内存

如何在C中的共享内存中保存int和数组?

我正在尝试编写一个程序,其中子进程在Linux上相互通信。 这些过程都是从同一个程序创建的,因此它们共享代码。 我需要他们可以访问两个整数变量以及一个整数数组。 我不知道共享内存如何工作,我搜索过的每一个资源都没有做任何事情,只会让我困惑。 任何帮助将不胜感激! 编辑:这是我迄今为止编写的一些代码的示例,只是为了共享一个int但它可能是错误的。 int segmentId; int sharedInt; const int shareSize = sizeof(int); /* Allocate shared memory segment */ segmentId = shmget(IPC_PRIVATE, shareSize, S_IRUSR | S_IWUSR); /* attach the shared memory segment */ sharedInt = (int) shmat(segmentId, NULL, 0); /* Rest of code will go here */ /* detach shared memory segment */ […]

在C中使用共享内存的fibonacci序列

我有一个问题要解决,但它给了我错误: 2009-EE-182-Part2.c: In function ‘main’: 2009-EE-182-Part2.c:35:13: error: expected identifier or ‘(‘ before ‘->’ token 2009-EE-182-Part2.c:40:22: error: expected identifier or ‘(‘ before ‘->’ token 2009-EE-182-Part2.c:41:14: error: expected identifier or ‘(‘ before ‘->’ token 2009-EE-182-Part2.c:42:22: error: expected expression before ‘shared_data’ 2009-EE-182-Part2.c:44:15: error: expected identifier or ‘(‘ before ‘->’ token 2009-EE-182-Part2.c:54:15: error: expected expression before ‘shared_data’ 2009-EE-182-Part2.c:55:19: error: […]

如何以保证的方式将虚拟地址传递给shmat()函数

我使用虚拟地址使用shmat()。 第一个进程使用shmaddr将shmat调用为null,当它获取数据块的虚拟地址时,它将存储在另一个共享的记忆位置。 第二个进程使用第一个进程存储在共享内存中的virtaul地址调用shmat()。 在大多数情况下,第二个进程通常可以附加到同一个虚拟地址,但在一种情况下我不能和shmat返回-1,当我使用gdb时,我看到地址是一个坏地址。 (gdb) x 0x800852000 0x800852000: Error accessing memory address 0x800852000: Bad address. 所以我的问题是我如何保证第一次获得两个进程都可以看到的虚拟地址?

为什么即使使用volatile关键字,编译器也会因strncmp()而优化掉共享内存读取?

这是一个程序foo.c ,它将数据写入共享内存。 #include #include #include #include #include #include #include #include int main() { key_t key; int shmid; char *mem; if ((key = ftok(“ftok”, 0)) == -1) { perror(“ftok”); return 1; } if ((shmid = shmget(key, 100, 0600 | IPC_CREAT)) == -1) { perror(“shmget”); return 1; } printf(“key: 0x%x; shmid: %d\n”, key, shmid); if ((mem = […]

如何在C中修改共享内存(shmget / shmat)?

我有一个结构: struct sdata { int x; int y; time_t time; }; 我为结构创建共享内存,如下所示: size_t shmsize = sizeof(struct sdata); shmid = shmget(IPC_PRIVATE, shmsize, IPC_CREAT | 0666); 然后我像这样访问共享内存: struct sdata *data = shmat(shared.shmid, (void *) 0, 0); data->time = time(NULL); // function returns the current time 我的问题非常简单。 这是访问/修改共享内存的正确方法吗? 这是最好的方法吗? (我使用System V信号量进行同步,但我没有包含该代码。我只是想确保正确访问/修改共享内存。)

共享内存和IPC

我正在阅读有关共享内存的教程,并发现以下语句:“如果进程希望通知另一个进程已将新数据插入共享内存,则必须使用信号,消息队列,管道,套接字或其他IPC的类型。“ 那么使用共享内存和其他类型的IPC仅用于通知而不是使用不需要任何其他IPC类型的IPC(如消息队列和套接字)的主要优点是什么?

C – fork()和共享内存

我需要我的父进程和子进程才能读取和写入相同的变量(类型为int),因此它在两个进程之间是“全局的”。 我假设这会使用某种跨进程通信,并且在一个进程上有一个变量正在更新。 我做了一个快速谷歌和IPC和各种技术出现,但我不知道哪个是最适合我的情况。 那么什么技术是最好的,你可以提供一个链接到它的noobs教程。 谢谢。

用fork()共享堆内存

我正在使用C实现一个数据库服务器,它将处理来自多个客户端的请求。 为此,我使用fork()来处理各个客户端的连接。 服务器将数据存储在堆中,该数据包含一个指向动态分配记录的哈希表的根指针。 记录是具有指向各种数据类型的指针的结构。 我希望进程能够共享此数据,以便当客户端对堆进行更改时,其他客户端将看到更改。 我已经知道fork()使用COW(Copy On Write) ,我的理解是,当子进程尝试修改内存中的数据时,它将复制父进程的堆(和堆栈)内存。 我发现我可以使用shm库来共享内存。 – 是否足以共享数据库的根指针或是否必须将所有已分配的内存分享? – 如果孩子分配内存,父/其他孩子能够访问它吗? – 如果一个孩子分配内存并且后来被杀死,分配的内存是否仍然留在堆上? 那么例如下面的代码是一种共享堆内存的有效方式(在shared_string中)? 如果一个孩子使用类似的代码(即从//开始),其他孩子在孩子跑步和死亡之后能够读/写吗? key_t key; int shmid; key = ftok(“/tmp”,’R’); shmid = shmget(key, 1024, 0644 | IPC_CREAT); //start char * string; string = malloc(sizeof(char) * 10); strcpy(string, “a string”); char * shared_string; shared_string = shmat(shmid, string, 0); strcpy(shared_string, string);

将队列设计为共享内存

我正在尝试将(循环)队列(在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()等创建/附加/检索/删除队列数据结构的共享内存的任何代码片段/示例都将是一个很好的帮助。

如何在C中的共享内存中创建信号量?

我的任务是创建两个不同的C文件,然后使用信号量进行进程同步(我同时运行两个C文件)。 我主要担心的是:如果我想在两个进程中访问信号量(C文件的可执行文件),我需要在共享内存中创建信号量。 我还需要创建二进制信号量。 因为这是我的第一个程序,有人可以建议如何开始这个吗? 我能够创建和使用共享内存,在线程中使用信号量。 我在YouTube上观看了一些讲座,但找不到合适的解决方案。