如何同时运行两个共享内存的C程序?

如何同时运行两个共享内存的C程序?,c,memory,shared,C,Memory,Shared,我有两个c文件:producer.c和consumer.c。使用者在内存中创建一个共享缓冲区,并等待生产者将项目放入缓冲区进行消费。生产者将共享内存附加到其内存映射,然后开始将项目放入缓冲区 问题是如何编译和运行它们 这是实际的作业。(我知道我可以用一个使用线程的c文件来完成,但这不是我要做的。) 在本部分中,您将开发一个生产者-消费者应用程序 将使用共享内存进行进程通信(POSIX共享 内存,而不是System V共享内存)。将有N个生产商和N个 消费者。N可以是1、2或3 您将开发一个生产者

我有两个c文件:producer.c和consumer.c。使用者在内存中创建一个共享缓冲区,并等待生产者将项目放入缓冲区进行消费。生产者将共享内存附加到其内存映射,然后开始将项目放入缓冲区

问题是如何编译和运行它们

这是实际的作业。(我知道我可以用一个使用线程的c文件来完成,但这不是我要做的。)

在本部分中,您将开发一个生产者-消费者应用程序 将使用共享内存进行进程通信(POSIX共享 内存,而不是System V共享内存)。将有N个生产商和N个 消费者。N可以是1、2或3

您将开发一个生产者程序(producer.c)和一个消费者程序 程序(consumer.c)。启动时,制作人程序将创建 N个子进程将充当N个生产者(即每个 子进程将是生产者进程)

类似地,当启动时,消费者程序将创建N个子项 进程,其中每个子进程将充当使用者 过程你会考虑消费者被认定为0, 1, 2, 取决于N。例如,如果N为2,则将有两个 消费者,0和1

消费者程序将首先运行。运行时,消费者程序 将首先创建大小为4KB的共享内存。这是共享内存 将是一个地方,你将有一个共享的单一缓冲坐。 生产者和消费者可以访问缓冲区。缓冲区 尺寸是100。它最多可以容纳100个项目(整数)。在共享空间中 记忆你可以有一些你感觉到的其他共享变量 必要的。消费者计划还将创建一个或多个 信号量(由您决定数量)

然后它将使用fork()创建N个子进程(N个使用者) 系统调用(不需要使用exec()系统调用)。这个 用户程序(父级)的主进程,在创建 子进程,不应终止。应该等到一切都好了 孩子(即消费者)完成任务并终止。当所有 如果子项终止,它将从中删除(删除)共享内存 系统。它还将删除信号量。那么它可以 也终止

每个生产者将读取一个正整数输入文件(一个 每行整数)并将整数通过共享 位于共享内存中的缓冲区(由使用者程序创建) 在生产者和消费者之间

每个使用者将从共享缓冲区读取整数并写入 将接收到的整数z转换为与使用者if z关联的输出文件 mod N等于消费者的ID。例如,如果N为3,则 如果消费者的ID为2且消费者已收到 整数7,它将不处理它(忽略),但如果它收到8, 它将把整数写入其输出文件。将生成一个输出文件 在一行中包含一个整数。而生产者和消费者 访问共享缓冲区时,应使用信号量,以便 访问是同步的。此外,如果缓冲区已满,则 我们应该睡觉,如果没有东西可吃,消费者应该 睡觉我们不应该忙着等待。您将使用POSIX信号量 (命名信号量)。消费者程序将按如下方式调用:
消费者N

这里,N是要创建的使用者进程数。价值 此参数的值必须与相应的参数相同 制片人的节目。在这里,是的名称 ID为X的使用者将使用的输出文件。编号为 输入的输出文件名的个数将等于N。是我们需要的名称 可用于标识共享内存。是一个我们可以用来 识别信号量(它可以是可用于 许多信号量的名称)。当需要时,必须使用这些相同的名称 调用生产者。制片人计划将命名为 producer和将使用以下参数调用:
制片人

这里,N是生产者的数量。是一个 producer X的输入文件。输入文件是存储 整数。我们输入的输入文件名数将等于N。 文件中可以有一个或多个整数。输入文件可以是 相当大(数十亿个整数)。是一个我们可以用来 识别共享内存。是一个我们可以用来识别的名字 信号灯

程序调用示例如下所示。
消费者3 out0.txt out1.txt out2.txt mysmem mysemaphores生产者3 in0.txt in1.txt in2.txt mysmem mysemaphore


只需在每个模块中添加一个
main()
。分别编译成两个不同的二进制文件并运行它们。

问题是如何同步共享一些内存的两个进程。您可以使用,但有许多其他方法可以做到这一点。

您不能简单地共享内存。您必须要求操作系统为您提供对可与其他进程共享的内存的访问。要使用的API取决于您的操作系统。而且,即使在像Linux这样的系统上,也有不止一种方法可以做到这一点,有不同的优点、缺点和限制。这里还有另一个问题,其中讨论了一些替代方法。我同意信号量和共享内存理论。在Linux环境中,我建议使用POSIX信号量用于进程和System V共享内存,也可以用其他方法实现,因为我认为这些方法很简单。

你说的“一起”是什么意思是吗?你需要一个新型的多任务操作系统。Unix系统在大型机上已经有一段时间了,我听说你可以在家里的这台漂亮的新Amiga计算机上得到它。我的操作系统是MacOSX Lion。没什么可做的