1

ファイルとの間でコマンドを保存およびフェッチする履歴コマンドをCで作成しました。今、パイプで「頭」を走らせようとしています。つまり歴史 | 頭-3

そのために、最初に dup2() パイプの終わりを書き込むための stdout があります。次に、printf を使用して履歴を出力しました (obv は画面に表示されません)。その後、標準入力をリダイレクトして、そのパイプと execvp() head コマンドを読み取りました。上位 3 行が正しく表示されています。しかし、まだユーザーの入力を待っています。Ctrl C で終了する必要があります。なぜこれが起こっているのか分かりません。履歴を表示した後、すべてを標準出力にフラッシュしようとしました。何も機能していないようです。

pid=fork();
if(pid==0){
    if(...first time..){
        if(dup2(fd[1],1)<0){
              printf("Error in Dup!!");
        }
        printHistory();
        for(k = 0;k < totalfds; k++){
              close(fd[k]);
        }
        return;
    }
    if(...second time..){
        if(dup2(fd[0],0)<0){
            printf("Error in Dup!!");
            }
    }   
    ...
    execvp(subcomm[0],subcomm);
    ...
}
4

1 に答える 1

1

コマンドが EOF で終了しない場合の通常の問題は、十分なファイル記述子を閉じていないことです。コマンドが開いているパイプの書き込みファイル記述子をまだ持っている場合、headパイプの書き込み側が開いているため、読み取りを試みてハングする可能性がありますhead。リターンを読む。

また、そうするあなたの子供は、それが終わったときにprintHistory()おそらくやるべきですexit(0)(または多分_exit(0)) - 戻ってはいけません。戻る場合は、おそらく読み取りループに戻ります。また、失敗した場合は、必ずプロセスを (0 以外のステータスで) 終了する必要がありexecvp()ます。execvp()関数または関数の他のメンバーの戻りステータスを確認する必要はありませんexec*()。彼らが戻ってきた場合、彼らは失敗しました。成功した場合、元のプロセスは新しいプロセスに置き換えられ、関数は戻りません。

また、一般的なコメントとして、メッセージを改行で終了してください。タイムリーに表示されるようにするのに役立ちます。stderrの代わりに にエラー メッセージを送信することも検討してくださいstdout

于 2013-09-12T23:43:05.317 に答える