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 を使用しているため、コンシューマは決して実行されません。プロデューサーとコンシューマーの両方を実行するために使用できるものはありますか?

ありがとう。

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 に答える