我有两个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 mod N等于消费者的ID,则每个消费者将从共享缓冲区读取整数并将接收的整数z写入与消费者相关联的输出文件.例如,如果N为3且消费者的ID为2且消费者已收到整数7,则它将不执行任何操作(忽略),但如果它收到8,则会将整数写入其输出文件.输出文件将在一行中包含一个整数.当生产者和消费者访问共享缓冲区时,他们应该使用信号量以便访问同步.另外,如果缓冲区已满,生产者应该睡觉,如果没有消费,消费者应该睡觉.我们不应该忙着等待.您将使用POSIX信号量(命名信号量).消费者计划将按如下方式调用:
消费者N ...这里,N是要创建的使用者进程的数量.此参数的值必须与生产者程序的相应参数相同.这里是消费者将使用ID X的输出文件的名称.输入的输出文件名的数量将等于N.是我们可以用来标识共享内存的名称.是我们可以用来标识信号量的名称(它可以是可用于许多信号量名称的前缀).调用生产者时必须使用这些相同的名称.生产者程序将被命名为生产者,并将使用以下参数调用:
producer N ...这里,N是生产者的数量.它是生产者X的输入文件的名称.输入文件是存储整数的文本文件.我们输入的输入文件名的数量将等于N.文件中可以有一个或多个整数.输入文件可能非常庞大(数十亿整数).是我们可以用来识别共享内存的名称.是我们可以用来识别信号量的名称.
程序的示例调用可以如下所示.
消费者3 out0.txt out1.txt out2.txt mysmem mysemaphores producer 3 in0.txt in1.txt in2.txt mysmem mysemaphore