0

コンソールから標準入力を受け取り、フィードバックを画面に出力するサービスとして実行されるプログラムがあります。次の簡単な例のように考えることができますが、printf()関数は実際にはもっと複雑な関数です。

//keyin.c
int main(int argc, char *argv[])
{
    char buf[80];
    int i = 1;

    while(i++){ 
    printf("enter %d string: \n", i);
    scanf("%s", buf);
    printf("print %d string: %s \n\n", i, buf);
    sleep(2);
    }

    return 0;
}

ここで、名前付きパイプを入力として使用して、別のプログラムを使用して、コンソールに入力する代わりに、パイプに書き込むことで目的のコマンドをサービスに渡すことができるようにします。

次の方法で名前付きパイプを作成しました。

mknod MYFIFO p

次に、次の方法で入力をリダイレクトします。

root@ubuntu: ./keyin < MYFIFO

次に、次の方法でコマンドをパイプに書き込みます。

root@ubuntu: echo "test" > MYFIFO

サービスが「テスト」を取得して印刷し、次の入力を待つことを期待していますが、最初の実行後、「テスト」を無限に印刷し続け、削除してもパイプファイルに再び応答することはありませんそれ。

私は何を間違えましたか?

4

1 に答える 1

1

の戻り値を確認する必要がありscanf()ます。同じ繰り返しバッファを取得するたびにscanf()、負の値が返されることに注意してください。

int main(int argc, char *argv[]){
   char buf[80];
   int i = 1;
       while(i++){
       if(scanf("%s", buf) > 0){
           printf("print %d string: %s \n\n", i, buf);
       }
       sleep(2);
    }
    return 0;
}

また、名前付きパイプは通常のパイプやコンソールと異なり、動作が異なることに注意してください。

于 2012-12-30T21:07:57.843 に答える