#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 関数です。
ロジックや構文のエラーがある場合は、お気軽に指摘してください。前もって感謝します!