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


    思维导图

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

    这是怎样的标准呢?

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

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

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

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

    在默认情况下,标准输出和标准错误都指向同一个文件,如果在终端前台执行,那么不管是标准输出还是标准错误,都是输出到终端。

    C语言对标准的运用

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

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

    stdinSTDIN_FILENO 都指向的是标准输入,前者是 FILE类型,就是我们所说文件句柄,而后者是int类型,就是我们所说的文件描述符。标准输出和标准错误也是一样的情况。

    所以,在不同的C接口,我们需要用不同的宏。

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

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

    #include <stdio>
    
    int main(int argc, char **argv)
    {
    	fprintf(stderr, "something error
    ");
    }
    

    Shell对标准的运用

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

    标准 运用 示例
    标准输入 < 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
    ");
    	fprintf(stderr, "stderr
    ");
    	write(STDOUT_FILENO, "STDOUT_FILENO
    ", strlen("STDOUT_FILENO
    "));
    	write(STDERR_FILENO, "STDERR_FILENO
    ", strlen("STDERR_FILENO
    "));
    }
    

    在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]$
    
  • 相关阅读:
    C#数据类型
    面试常备题素数的判断
    Eclipse输入命令行参数
    Socket编程第一步PC上服务器回显客户端发送的字符串
    C# 格式化输出
    截止至2004年8月1日全球CCIE人数统计
    什么是3G?
    DoS 拒绝服务攻击专题
    我的Blog音乐版~~
    国庆啊~~累得我好苦啊~~~
  • 原文地址:https://www.cnblogs.com/gmpy/p/10658722.html
Copyright © 2020-2023  润新知