同时运行两个C程序共享内存,怎么样?

时间:2011-11-12 09:09:24

标签: c memory shared

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

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

这是实际的作业。 (我知道我可以使用一个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.

     

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

     

然后它将使用fork()创建N个子进程(N个消费者)   系统调用(您不需要使用exec()系统调用)。该   消费者计划(父母)的主要过程,创建后   子进程,不应该终止。它应该等到全部   儿童(即消费者)完成任务并终止。什么时候   子进程终止,它将删除(删除)共享内存   系统。它还将删除(删除)信号量。然后就可以了   终止也是。

     

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

     

每个使用者将从共享缓冲区读取整数并写入   收到的整数z到与if消费者相关的输出文件   mod N等于消费者的ID。例如,如果N是3和   如果消费者的ID是2并且消费者已经收到了   整数7,它将无效(忽略),但如果它收到8,   它会将整数写入其输出文件。输出文件将   一行中包含一个整数。虽然是生产者和消费者   访问共享缓冲区时,应使用信号量   访问是同步的。另外,如果缓冲区已满,则为生产者   应该睡觉,如果没有什么可以消费,消费者应该   睡觉。我们不应该忙着等待。您将使用POSIX信号量   (命名信号量)。消费者计划将按如下方式调用:
  消费者N ...

     

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

     

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

     

程序的示例调用可以如下所示   消费者3 out0.txt out1.txt out2.txt mysmem mysemaphores producer 3   in0.txt in1.txt in2.txt mysmem mysemaphore

4 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

你不能简单地分享记忆。您必须要求操作系统为您提供对可与其他进程共享的内存的访问权限。要使用的API取决于您的操作系统。此外,即使在类似Linux的东西上,也有不止一种方法可以通过不同的优点,缺点和限制来实现这一点。这是另一个问题,其中讨论了一些替代方案Shmem vs tmpfs vs mmap

答案 3 :(得分:0)

我同意Semaphores,并且分享了memeory。在Linux环境中,我建议POSIX信号量用于进程和System V共享内存,其他方式也可以实现它,只是因为我认为这些方法很简单。