标准文件描述符与标准文件句柄

思惟导图

本文并不是阐述文件描述符与文件句柄的异同,而是标准shell

这是怎样的标准呢?

fork建立一个进程,规定默认存在3个文件描述符,分别是bash

描述符编号 简介 做用
0 标准输入 通用于获取输入的文件描述符
1 标准输出 通用输出普通讯息的文件描述符
2 标准错误 通用输出错误信息的文件描述符

标准输入比较好理解,在函数scanf中,就是从标准输入获取的数据。咱们执行一个命令,只要此命令在前台执行,标准输入就是咱们在终端的输入。函数

标准输出与标准错误用途是有差异的。从命名上咱们就发现,标准错误用于输出错误信息,而标准输出更多只是输出提示信息。经过不一样的文件描述符,把普通的提示信息和错误提示信息区分开,很是方便于过滤日志。日志

在默认状况下,标准输出和标准错误都指向同一个文件,若是在终端前台执行,那么无论是标准输出仍是标准错误,都是输出到终端。code

C语言对标准的运用

C中与这标准相关的宏有六个,blog

标准 stdio.h unistd.h
标准输入 stdin STDIN_FILENO
标准输出 stdout STDOUT_FILENO
标准错误 stderr STDERR_FILENO

stdinSTDIN_FILENO 都指向的是标准输入,前者是 FILE类型,就是咱们所说文件句柄,然后者是int类型,就是咱们所说的文件描述符。标准输出和标准错误也是同样的状况。接口

因此,在不一样的C接口,咱们须要用不一样的宏。进程

fprintf(stdout, "stdout\n");
write(STDOUT_FILENO, "STDOUT_FILENO\n", 14);

前面有提到,标准输入、标准输出、标准错误是默认存在的,也就是说咱们不须要open或者fopen,能够直接使用。例如input

#include <stdio>

int main(int argc, char **argv)
{
    fprintf(stderr, "something error\n");
}

Shell对标准的运用

Shell命令常常用到的 重定向 实际上就是对标准的运用string

标准 运用 示例
标准输入 < cat < helloworld.c
标准输出 > 或者 1> echo "helloworld" > stdout.log
标准错误 2> grep "error" 2>/dev/null

C&Shell配合

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>

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]$
相关文章
相关标签/搜索