• STDIN_FILENO vs stdin


    数据类型不一致:
    stdin类型为 FILE*
    STDIN_FILENO类型为 int

    使用stdin的函数主要有:fread、fwrite、fclose等,基本上都以f开头
    使用STDIN_FILENO的函数有:read、write、close等
     
    可用fileno()转换
     
    1.STDIN_FILENO的作用
    STDIN_FILENO属于系统API接口库,其声明为 int 型,是一个打开文件句柄,对应的函数主要包括 open/read/write/close 等系统级调用。
     
    操作系统一级提供的文件API都是以文件描述符来表示文件。STDIN_FILENO就是标准输入设备(一般是键盘)的文件描述符。
     
     
    2.区别
     
    1)数据类型不一致:
    stdin类型为 FILE*
    STDIN_FILENO类型为 int
    使用stdin的函数主要有:fread、fwrite、fclose等,基本上都以f开头
    使用STDIN_FILENO的函数有:read、write、close等
    2)stdin等是FILE *类型,属于标准I/O,高级的输入输出函数。在<stdio.h>。
    STDIN_FILENO等是文件描述符,是非负整数,一般定义为0, 1, 2,属于没有buffer的I/O,直接调用系统调用,在<unistd.h>。
     
    3)STDIN_FILENO 是标准输入的文件描述符
    详见/usr/include/unistd.h
    代码:
    /* Standard file descriptors. */
    #define STDIN_FILENO 0 /* Standard input. */
    #define STDOUT_FILENO 1 /* Standard output. */
    #define STDERR_FILENO 2 /* Standard error output. */
     
    4)层次不一样。STDIN 属于标准库处理的输入流,其声明为 FILE 型的,对应的函数前面都有f开头,如fopen/fread/fwrite/fclose 标准库调用等
    STDIN_FILENO属于系统API接口库,其声明为 int 型,是一个打开文件句柄,对应的函数主要包括 open/read/write/close 等系统级调用。
     
    标准库内封装了系统 API 调用,如 fread 内部实现调用 read。
     
    5)操作系统一级提供的文件API都是以文件描述符来表示文件。STDIN_FILENO就是标准输入设备(一般是键盘)的文件描述符。
     
    6)曾经很纳闷,为什么一个整形fd(STDIN_FILENO=0)就可以代表一个打开的文件呢?
    后来明白了,和我们的手机号是类似的,手机号只是一个9位数的整形,但是在移动通话网络里,它就可以用来区分不同的手机终端。
    标准C++一级提供的文件操作函数库都是用FILE*来表示文件,stdin就是指向标准输入设备文件的FILE*。
     
    函数名称:fileno(在VC++6.0下为_fileno[1] )
    函数原型:int _fileno( FILE *stream );
    函数功能:fileno()用来取得参数stream指定的文件流所使用的文件描述符
    返回值:某个数据流的文件描述符
    头文件:stdio.h
    相关函数:open,fopen,fclose

    2程序示例编辑

    先看MSDN上的例子:
    #include <stdio.h>
    int main( void )
    {
    printf( "The file descriptor for stdin is %d ", _fileno( stdin ) );
    printf( "The file descriptor for stdout is %d ", _fileno( stdout ) );
    printf( "The file descriptor for stderr is %d ", _fileno( stderr ) );
    }
    输出:
    The file descriptor for stdin is 0
    The file descriptor for stdout is 1
    The file descriptor for stderr is 2
  • 相关阅读:
    vue单文件组件形成父子(子父)组件之间通信(vue父组件传递数据给子组件,子组件传递数据给父组件)
    appium 问题四的解决办法(模拟器打开的页面弹出框与脚本打开页面的弹出框不一致)
    appium 自动化问题三--键盘关键字的使用
    RF+appium自动化问题二解决思路
    appium自动化滑动鼠标滚动条的用法
    appium自动化中元素定位碰到的问题一
    appium自动化时,输入中文不显示的问题解决
    appium自动化模拟器使用
    pycharm 无法识别selenium,appium等工具时的解决办法
    Mysql基础学习(二)之DQL的使用
  • 原文地址:https://www.cnblogs.com/diegodu/p/3988549.html
Copyright © 2020-2023  润新知