在这一部分中,您将开发 将使用共享内存的过程生产者 - 消费者的应用通信(POSIX共享 内存,而不是System V共享内存)。将有N家生产商和N 消费者。 N可以是1,2或3.
您将开发一个生产者程序(producer.c)和一个消费者程序(consumer.c) 。当开始时,生产者程序将创建N个子过程,其将作为N个生产者(即,每个 子过程将是生产者过程)。
同样,启动时,消费者程序将创建N个子进程,其中每个子进程将充当消费者进程 。您会考虑根据N确定消费者为0,1,2, 。例如,如果N为2,那么将有两个消费者0和1.
消费者计划将首先运行。运行时,消费者程序 将首先创建大小为4 KB的共享内存。这个共享内存 将是您将拥有共享单个缓冲区的地方。 生产者和消费者可以访问缓冲区。缓冲区 大小为100.它最多可容纳100个项目(整数)。在共享的 内存中,您可以有一些其他共享变量,您觉得它们是必需的。消费者计划还将创建一个或多个信号量(您决定多少个信号量)。
然后它将使用fork() 系统调用(您不需要使用exec()系统调用)创建N个子进程(N个消费者)。消费者程序(父级)的主进程在创建子进程后不应终止。它应该等到所有 儿童(即消费者)完成他们的任务并终止。当所有 孩子终止时,它将从系统的 中删除(删除)共享内存。它也将删除(删除)信号量。然后它可以终止以及 。
每个生产者将读取的正整数的一个输入文件(每行一个 整数),将只是通过共享 缓冲器坐在在共享存储器(由消费者程序创建)通过整数的生产者和消费者之间 。
每个消费者将从共享缓冲区读取整数,并且将 接收到的整数z写入到与消费者相关联的输出文件中,如果zN modN等于消费者的ID。例如,如果N是3并且 如果消费者的ID是2并且消费者已经收到了 整数7,则它将不执行任何操作(忽略),但是如果它接收到8, 它将把整数写入其输出文件。输出文件 在一行中包含一个整数。虽然生产者和消费者访问共享缓冲区的地址是 ,但他们应该使用信号量,以便 访问得到同步。此外,如果缓冲区已满,生产商 应该睡觉,如果没有东西要消费,消费者应该睡觉。我们不应该等待。您将使用POSIX信号量 (称为信号量)。消费者程序将被调用如下:
消费者N ...
这里,N是要创建的消费者进程的数量。该参数的值 必须与生产者程序的相应参数 相同。在这里,输出文件的名称是 ,消费者将使用ID为X的编号。输入的输出文件名的编号为 将等于N.是我们用 可以识别共享内存的名称。是我们可用于识别信号量的名称(它可以是可用于许多信号量的名称的 的前缀) 。当 调用生产者时,必须使用这些相同的名称。生产者程序将被命名为 制片人,并具有下列参数调用:
生产ň...
这里,N是生产者的数量。这是生产者X的 输入文件的名称。输入文件是存储 整数的文本文件。我们输入的输入文件名称的数量将等于N. 文件中可以有一个或多个整数。一个输入文件可以是相当大(数十亿整数)的 。是我们可以用来识别共享内存的名称。是我们可以用来识别信号量的名称。
程序的示例调用可以如下所示。
消费3 out0.txt out1.txt out2.txt mysmem mysemaphores生产3 in0.txt in1.txt in2.txt mysmem mysemaphore