0

私の 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 つあります。

  1. このコードが正しく機能しないのはなぜですか?どうすれば修正できますか?
  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
4

1 に答える 1

2

デフォルトのstdoutファイル記述子がないようです。stdout閉じています。

于 2011-08-03T17:29:36.207 に答える