私の C プログラムでは、「cat」UNIX コマンドを実行するシステム コールを次のように作成します。
sprintf(command, "cat %s", filename);
fprintf(stderr, "Executing command: '%s'\n", command);
system(command);
プログラムをコンパイルして実行すると、コマンドが正しく実行されません。代わりに、次のエラーが表示されます。
Executing command: 'cat temp.txt'
cat: stdout: Bad file descriptor
私の質問は 2 つあります。
- このコードが正しく機能しないのはなぜですか?どうすれば修正できますか?
perl -e 'system("cat temp.txt")'
コマンドラインで試してみると、期待どおりに動作します。Perl がファイルハンドルを処理する方法と C がファイルハンドルを処理する方法の違いは何ですか?
ありがとう!
更新: コメントのおかげで、私は問題をすぐに理解しました。プログラムの早い段階で誤って stdout を閉じてしまったため、cat
プログラムが stdout に出力しようとしたときにエラーが発生しました。したがって、C と Perl のファイル ハンドルの処理方法に違いはないように見えます。次のコマンドは、まったく同じエラーを生成します。
$ perl -e 'close(STDOUT); system("cat temp.txt")'
cat: stdout: Bad file descriptor