的UNIX手冊頁unistd.h
狀態:我可以創建與stdout和stderr不同的自己的輸出流嗎?
The following symbolic constants are defined for file streams:
STDIN_FILENO File number of stdin. It is 0.
STDOUT_FILENO File number of stdout. It is 1.
STDERR_FILENO File number of stderr. It is 2.
grepping我所有的頭文件,我覺得這是真的。
[/usr]grep -r "STDIN_FILENO" include
include/unistd.h:#define STDIN_FILENO 0 /* Standard input. */
[/usr] grep -r "STDOUT_FILENO" include
include/unistd.h:#define STDOUT_FILENO 1 /* Standard output. */
[/usr]grep -r "STDERR_FILENO" include
include/boost/asio/detail/impl/handler_tracking.ipp: ::write(STDERR_FILENO, line, length);
include/unistd.h:#define STDERR_FILENO 2 /* Standard error output. */
即使它們被定義,它們似乎永遠不會被我的機器上的任何其他std頭文件使用。我覺得很奇怪。或許0,1和2用於別處而不是定義的宏。這些宏只是作爲流如何配置的指示而被引用。
無論如何,我們可以通過這樣捕捉到外殼特定輸出流:
./program 1> stdout.txt
./program 2> stderr.txt
./program > both.txt 2>&1
我要創造我自己的輸出流,並通過這樣捕獲它:
./program 3> mine.txt
我嘗試搜索unistd.h
和<iostream>
包含的其他文件,以瞭解std::cout
和std::cerr
如何工作,但正如您可能想象的那樣,我迷失了方向並感到困惑。
我更關心你是否可以做到這一點,而不是它是否是一個好主意。
看一看Bash文檔。文件描述符通過bash從登錄或終端程序繼承,然後由程序繼承。 – 2014-10-02 01:49:17
如果你使用的是GCC,你可能會發現它的非標準庫有用:''它允許你創建一個'std :: filebuf'(以及一個'std :: fstream')一個POSIX文件描述符。 –
Galik
2014-10-02 02:38:31