我正在尝试使用信号量和共享内存在C中创建生产者 - 消费者问题。我有信号量和共享内存工作,但我无法确定如何管理个人消费者和生产者。
这是IS作业,并且要求声明生产者和消费者必须是单线程进程。我已经联系了教授,他建议使用fork()。我认为这意味着我不能使用pthread()。
目前,我为生产者和消费者提供了单独的应用程序(即每个应用程序都有自己的main())。我需要能够像用户指定的那样运行多组生产者和消费者,并在一段时间后终止应用程序。
最初我试过这个
int Ppid = fork();
if(Ppid == 0){
execv("pathtoproducer", NULL);
}
int Cpid = fork();
if(Cpid == 0){
execv("pathtoconsumer", NULL);
}
//close semaphores and detach shared memory
当然,这会导致问题,因为应用程序将在运行分叉进程之前关闭信号量。
所以我想做这样的事情:
int pid = fork();
if(pid == 0){
execv("pathtoproducer", NULL);
execv("pathtoconsumer", NULL);
}
else{
//wait for timer to run out
}
//detach shared memory and close semaphore
但当然,因为我使用execv,消费者永远不会运行。有什么东西我可以用来让生产者和消费者一起运行(请记住,我需要有一定数量的它们,我只是尝试在这个例子中使用一套)。
感谢。
答案 0 :(得分:1)
好吧,你总是可以做一个嵌套的分叉。
int pid = fork();
if (pid == 0){
int pid2 = fork();
if (pid2 == 0)
execv("pathtoproducer", NULL);
else
execv("pathtoconsumer", NULL);
} else {
顺便说一下。等待你的孩子有比计时器更好的方法。
答案 1 :(得分:0)
也许我错过了你的部分要求,但你似乎正在努力实现这一目标。
for (i=0...numConsumers)
fork consumers; //they can't do anything without something to consume
for (i=0...numProducers)
fork producers;
select(null, null, null, null, timetowait);
for (i=0...numProducers + numConsumers)
kill(childPid, sigusr1);
wait();
//whatever remain todo in parent...
生产者/消费者计划中需要一个简单的信号处理程序,然后程序会以有序的方式关闭自己。如果你不想使用信号,你可以使用管道或其他任何东西......包括一个简单的共享内存开关,因为你已经有了它的工作。