linux 标准输入句柄,标准文件描述符与标准文件句柄
本文并非闡述文件描述符與文件句柄的異同,而是標準
這是怎樣的標準呢?
fork創建一個進程,規定默認存在3個文件描述符,分別是
描述符編號
簡介
作用
0
標準輸入
通用于獲取輸入的文件描述符
1
標準輸出
通用輸出普通信息的文件描述符
2
標準錯誤
通用輸出錯誤信息的文件描述符
標準輸入比較好理解,在函數scanf中,就是從標準輸入獲取的數據。我們執行一個命令,只要此命令在前臺執行,標準輸入就是我們在終端的輸入。
標準輸出與標準錯誤用途是有差別的。從命名上我們就發現,標準錯誤用于輸出錯誤信息,而標準輸出更多只是輸出提示信息。通過不同的文件描述符,把普通的提示信息和錯誤提示信息區分開,非常方便于過濾日志。
在默認情況下,標準輸出和標準錯誤都指向同一個文件,如果在終端前臺執行,那么不管是標準輸出還是標準錯誤,都是輸出到終端。
C語言對標準的運用
C中與這標準相關的宏有六個,
標準
stdio.h
unistd.h
標準輸入
stdin
STDIN_FILENO
標準輸出
stdout
STDOUT_FILENO
標準錯誤
stderr
STDERR_FILENO
stdin 和 STDIN_FILENO 都指向的是標準輸入,前者是 FILE類型,就是我們所說文件句柄,而后者是int類型,就是我們所說的文件描述符。標準輸出和標準錯誤也是一樣的情況。
所以,在不同的C接口,我們需要用不同的宏。
fprintf(stdout, "stdout\n");
write(STDOUT_FILENO, "STDOUT_FILENO\n", 14);
前面有提到,標準輸入、標準輸出、標準錯誤是默認存在的,也就是說我們不需要open或者fopen,可以直接使用。例如
#include
int main(int argc, char **argv)
{
fprintf(stderr, "something error\n");
}
Shell對標準的運用
Shell命令經常用到的 重定向 實際上就是對標準的運用
標準
運用
示例
標準輸入
<
cat < helloworld.c
標準輸出
> 或者 1>
echo "helloworld" > stdout.log
標準錯誤
2>
grep "error" 2>/dev/null
C&Shell配合
#include
#include
#include
#include
int main(int argc, char **argv)
{
char input[100];
FILE *file;
fprintf(stdout, "stdout\n");
fprintf(stderr, "stderr\n");
write(STDOUT_FILENO, "STDOUT_FILENO\n", strlen("STDOUT_FILENO\n"));
write(STDERR_FILENO, "STDERR_FILENO\n", strlen("STDERR_FILENO\n"));
}
在Bash shell中直接執行,默認情況下,標準輸出和標準錯誤都輸出到終端
[GMPY@14:43 tmp]$./stdio
stdout
stderr
STDOUT_FILENO
STDERR_FILENO
通過Shell重定向的方法,區分開標準輸出和標準錯誤的日志
[GMPY@14:43 tmp]$./stdio 2>stderr.log 1>stdout.log
[GMPY@14:47 tmp]$cat stderr.log
stderr
STDERR_FILENO
[GMPY@14:47 tmp]$cat stdout.log
STDOUT_FILENO
stdout
[GMPY@14:47 tmp]$
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結
以上是生活随笔為你收集整理的linux 标准输入句柄,标准文件描述符与标准文件句柄的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用c语言实现串的存储结构是指,数据结构学
- 下一篇: ryzen处理器内存选择:频率、容量、时