0
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>

(pthread またはセマフォではない)

上記が私が使用する唯一のライブラリである場合、リーダーが共有バッファーからロードする前に最初のライター入力を待機するようにするにはどうすればよいですか?

プログラムを実行すると、ライターがユーザー入力を呼び出す前に、リーダーがジャンク値をバッファーに出力します。機能せず、scanfユーザーの入力を待たずに続行します。すべての子プロセスが終了する前にメイン プロセスが終了するように見え、その場合、子プロセスが入力を受け付けなくなるので、解決方法はありますか?

お気に入り:

@ubuntu.....(returned?)
reader gets the data:1
Enter your data:
reader gets the data:1

私のソースコードは以下の通りです:

void reader(int i) 
{
   int data;
   if(nextp == N)
      nextp=0;
   printf("\nEnter the data(writer %d) :",i);
   scanf("%d",(buffer+nextp));
   nextp++;
}

void writer(int i)
{
   int g;
   if(nextc == N)
      nextc=0;
   g=*(buffer+nextc++);
   printf("\nreader %d gets the data:%d\n",i,g);
}

in main():
int k;
for(k=RW;k>0;--k)//RW is number of readers and writers
{
   pid = fork();
   if(!pid)
   {
      pid = fork();
      if(pid>0)//writer (child)
      {
         for(i=0;i<N;i++)
         {
            P(empty); 
            P(mutex); // Entering critical section
            P(write);
            writer(k);
            V(write);
            V(mutex); // Exit from critical section
            V(full); 
         }
         wait();
      }

      if(pid==0)//reader (grandchild)
      {

         int readsize;
         readsize = N*RW;
         for(i=0;i<readsize;i++)
         {
            P(full);
            P(mutex); // Entering critical section
            P(rd_count);
            if(N-1 == (j=sem_val(rd_count))) /* Write lock for first reader */
               P(write); /* Once we have it, it keeps writers at bay */
            V(mutex); 
            reader(k);
            P(mutex);
            V(rd_count);
            if(N == (j=sem_val(rd_count))) /* When last reader leaves: */
               V(write);                   /* Allow writers */
            V(mutex);
            V(empty); // Exit from critical section
         }
         wait();
      }
   }
}

sem_valカスタムgetval機能です。

Pカスタム -1 semop 関数です。

Vカスタム +1 semop 関数です。

ロジックや構文のエラーがある場合は、お気軽に指摘してください。前もって感謝します!

4

1 に答える 1

-1

によってプロセスが作成されると、メモリ リソースが共有されないためですfork。むしろ試してみてくださいvfork

によって作成されたとき、各子プロセスには独自のメモリがありforkます。

使用されているセマフォもプロセスを同期する必要があることを確認してください。

于 2013-11-07T04:16:17.847 に答える