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