0

我正在尝试使用信号量和共享内存在 C 中创建生产者-消费者问题。我已经让信号量和共享内存正常工作,但我无法确定如何运行个人消费者和生产者。

这是作业,要求规定生产者和消费者必须是单线程进程。我已经联系了教授,他建议使用 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,所以消费者永远不会运行。有什么我可以用来让生产者和消费者都运行的东西吗(请记住,我需要有 n 个它们,在这个例子中我只是尝试使用一个集合)。

谢谢。

4

2 回答 2

1

好吧,你总是可以做一个嵌套的叉子。

 int pid = fork();
 if (pid == 0){
     int pid2 = fork();
     if (pid2 == 0)
         execv("pathtoproducer", NULL);
     else
         execv("pathtoconsumer", NULL);
 } else {

顺便提一句。有比计时器更好的方法来等待你的孩子。

于 2012-10-27T21:57:35.673 回答
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...

您需要在被捕获的生产者/消费者程序中使用一个简单的信号处理程序,然后程序会继续以有序的方式自行关闭。如果您不想使用信号,则可以使用管道或其他任何东西……包括一个简单的共享内存开关,因为无论如何您已经可以使用它了。

于 2012-10-28T16:06:35.953 回答