私は fork を使用しており、子プロセスは for ループ内で scanf を使用してユーザーからデータを 10 回読み取ります。ただし、親プロセスは、4 秒間のスリープ後に SIGSTOP シグナルを子プロセスに送信し、ユーザーから値を読み取り、それを出力します。ただし、ユーザーがデータを入力したが、子プロセスの scanf で Enter キーを押さなかった場合、親プロセスは子プロセスで書き込まれたデータを読み取りますが、出力します。これが起こらないようにするにはどうすればよいですか。
ch=fork();
if(ch==0)
{
for(i=0;i<10;i++)
{
fflush(stdin);
scanf("%s",buf);
printf("%d: %s\n",i,buf);
}
}
else
{
char buf2[100],cha;
sleep(4);
kill(ch,SIGSTOP);
write(STDOUT_FILENO,"\nchld stopped\n",14);
memset(stdin,0,sizeof(stdin));
read(STDIN_FILENO,buf2,2);
write(STDOUT_FILENO,buf2,2);
kill(ch,SIGCONT);
wait(SIGCHLD);
}
たとえば、出力は次のようになります。
a
0: あ
b
1:う
ac (ここで Enter キーを押して SIGSTOP を待つことはしません)
chldが停止しました
tr (親のデータを入力し、Enter キーを押した)
ac2: トラ
c
3: c ...など
では、tr を入力した後、親が ac を表示するのはなぜですか?