0

私は 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 を表示するのはなぜですか?

4

3 に答える 3

1

さて、私は解決策を見つけました。

私は tcflush() を使用しました: 送信されていない出力データ、読み取られていない入力データ、またはその両方をフラッシュします。

tcflush(STDIN_FILENO,TCIFLUSH); 親の読み取りの直前の行がそれを行いました。

ここで解決策を見つけました... UNIX システムの tty 入力キューから未読データをフラッシュするにはどうすればよいですか?

于 2014-09-15T13:43:27.970 に答える
0

これは read(), write() 関数によるものです。Enterキーを押さずに何かを入力したとき。stdinput にあるものは何でも、例で指定されているように、buf2 の read() 関数ストアによって読み取られます。そして、buf2 にあるものは何でも、write() によって stdoutput に送信されます。read()、write() 関数にコメントを付けるか、単に「buf2」と出力すると、違いがわかります。

于 2014-09-15T14:01:41.447 に答える