1

(apologies for not taking care of my accepts lately - will do so as soon as I get some time; just wanted to ask this question now that it occurred)

Consider the following C program:

int main(void) {
  write(3, "aaaaaa\n", 7);
  write(2, "bbbbbb\n", 7);
  write(1, "cccccc\n", 7);
  return 0;
}

I build and run it from the bash shell like this:

$ gcc -o wtest wtest.c
$ ./wtest 3>/dev/stdout
aaaaaa
bbbbbb
cccccc

The way I see it, in this case, due to the shell redirection of fd 3 to stdout, that file descriptor is now "used" (not sure about "opened", since there is no opening of files, in the C code at least) - and so we get the cccccc string output to terminal, as expected.

If I don't use the redirection, then the output is this:

$ ./wtest 
aaaaaa
bbbbbb

Now fd 3 is not redirected - and so cccccc string is not output, again as expected.

 

My question is - what happened to those cccccc bytes? Did they dissapear in the same sense, as if I redirected fd 3 to /dev/null? (as in:

$ ./wtest 3>/dev/null

)

In addition, assuming that in a particular case I'd like to "hide" the fd 3 output: would there be a performance difference between redirecting "3>/dev/null" vs. not addressing fd 3 in the shell at all (in terms of streaming data; that is, if fd 3 outputs a really long byte stream, would there be an instruction penalty per byte written in the "3>/dev/null" case, as opposed to not addressing fd 3)?

 

Many thanks in advance for any answers,
Cheers!

4

2 に答える 2

4

私の質問は - それらの cccccc バイトに何が起こったのですか?

なし。のリターン コードを取得できませんでしたwrite。エラーが発生しerrnoたことと、エラーの内容が示されているはずです。

また、永続的なものについて疑わしい概念があるようです。「バイト」は、コンパイラーが最初から配置した文字列リテラルにまだ残っています。writebyte をストリームにコピーします。

于 2012-10-31T20:16:34.677 に答える
0

ジェンスは正しい。両方の状況で strace の下でプログラムを実行すると、リダイレクトすると書き込みが機能することがわかります。これは、シェルが実行可能ファイルを fork する前に、ユーザーに代わって pipe() を呼び出したためです。

リダイレクトなしで strace を見ると、次のようになります。

write(3, "aaaaaa\n", 7)                 = -1 EBADF (Bad file descriptor)
write(2, "bbbbbb\n", 7bbbbbb)                 = 7
write(1, "cccccc\n", 7cccccc)                 = 7

これは、ベスト プラクティスを思い起こさせます。常に戻り値を確認してください。

于 2012-10-31T20:24:48.317 に答える