文字を含むboxIn[]
型の配列があります。共有メモリにあります。配列内の のいずれかの値を持つ共有メモリ内の もあります。char
R R G B G B O Y O O P R
boxIn[]
char*
p
char
boxIn[]
プログラムでは、次のように 2 つのセマフォが定義されています。
/* initialize semaphores */
if((sem_init(&sem, pshared, value)) == 1){ /* only 2(value) processes at the same time */
perror("Error initializing synch semaphore\n");
exit(1);
}
if((sem_init(&mutex, pshared, 1)) == 1){ /* only 1 processes at the same time */
perror("Error initializing synch semaphore\n");
exit(1);
}
for
ループから子をフォークします。
/* fork child processes */
for(i=0; i<n ; i++){
pid = fork();
if(pid < 0){ /* check for error */
printf("Fork error.\n");
}
else if(pid == 0) break; /* child processes */
}
次に、子供たちにいくつかの処理をさせます。今は一歩ずつ目標に向かって頑張っています。したがって、*p
の値を一度だけ変更します。
/******************************************************/
/****************** PARENT PROCESS ****************/
/******************************************************/
if(pid != 0){
while(wait()>0);
}
/******************************************************/
/****************** CHILD PROCESS *****************/
/******************************************************/
else{
while(*p != boxIn[i]); /* wait until it's my turn */
sem_wait(&sem);
printf("%c boxes are being painted.\n",boxIn[i]);
printf("Done painting.\n");
sleep(1);
sem_wait(&mutex);
if(*p=='R') *p='G';
sem_post(&mutex);
sem_post(&sem);
exit(1);
}
ただし、予期しない出力が得られます。
私が期待するものは次のとおりです。
R boxes are being painted.
R boxes are being painted.
Done.
Done.
R boxes are being painted.
Done.
G boxes are being painted.
G boxes are being painted.
Done.
Done.
そして、私が得るものは次のとおりです:
R boxes are being painted.
Done painting.
R boxes are being painted.
Done painting.
R boxes are being painted.
Done painting.
G boxes are being painted.
Done painting.
G boxes are being painted.
Done painting.
varaquilex@computer ~/Dropbox/Courses/BLG312E - Computer Operating Systems/hw3 $ G boxes are being painted.
Done painting.
G boxes are being painted.
Done painting.
G boxes are being painted.
Done painting.
G boxes are being painted.
Done painting.
G boxes are being painted.
G boxes are being painted.
Done painting.
Done painting.
G boxes are being painted.
Done painting.
G boxes are being painted.
Done painting.
P boxes are being painted.
Done painting.
P boxes are being painted.
Done painting.
P boxes are being painted.
Done painting.
P boxes are being painted.
Done painting.
P boxes are being painted.
Done painting.
^C
質問: 配列にボックスG
が 2 つしかないのに、なぜ 2 つ以上のボックスが描画されるのですか?さらに重要なことに、配列にボックスが 1 つしかなく、多くのボックスを取得することは言うまでもなく、ボックスを描画する方法さえあります描きました?G
boxIn[]
P
P
P
注:私は長い間試してきました。言うまでもなく、Shift+C を使用して、このプログラムの前に多くのプログラムを停止しました。ターミナルを再起動すると、この出力が得られました。さらに興味深い点は、i
ペイントされているボックスと一緒に の値を印刷しようとしたところ、出力が混同されていることがわかりました! つまり、表示される行がいくつかあり、G boxes(3) are being painted
他の行はがG boxes are being painted
あったとしても表示されましprintf()
たprintf("%c boxes(%d) are being painted",boxIn[i],i);
。これは厄介です。オペレーティング システムを再起動したところ、同じプログラムから別の出力が得られました。なぜこれが発生するのか、またこれが再び発生しないようにするにはどうすればよいかを誰かに説明してもらえますか?