zoukankan      html  css  js  c++  java
  • stdin和STDIN_FILENO的区别

    STDIN_FILENO与stdin的区别:

      STDIN_FILENO:

      1).数据类型:int

      2).层次:系统级的API,是一个文件句柄,定义在<unistd.h>中。

      3).相应的函数:open(),close(),read(),write(),lseek()等系统级别的函数。

      stdin

      1).数据类型:FILE *

      2).层次:c语言的提供的标准输入流。c语言标准库封装系统函数实现。高级的输入输出函数。可在<stdio.h>中找到外部声明。

      3).相应的函数:fopen(),fclose(),fread(),fwrite(),fseek()等c语言标准函数。

    <unistd.h>

    /* Standard file descriptors.  */
    #define STDIN_FILENO    0       /* Standard input.  */
    #define STDOUT_FILENO   1       /* Standard output.  */
    #define STDERR_FILENO   2       /* Standard error output.  */

    <stdio.h>

    复制代码
    /* Standard streams.  */
    extern struct _IO_FILE *stdin;          /* Standard input stream.  */
    extern struct _IO_FILE *stdout;         /* Standard output stream.  */
    extern struct _IO_FILE *stderr;         /* Standard error output stream.  */
    /* C89/C99 say they're macros.  Make them happy.  */
    #define stdin stdin
    #define stdout stdout
    #define stderr stderr
    复制代码

                                   

    转自:http://www.cnblogs.com/svking/archive/2012/08/08/STDIN_FILENO.html

    --------------------------------------------------


    在unix系统调用中,标准输入描述字用stdin,标准输出用stdout,标准出错用stderr表示,但在一些调用函数,引用了STDIN_FILENO表示标准输入,同样,标准出入用STDOUT_FILENO,标准出错用STDERR_FILENO.

    请问,他们有什么区别吗?
    1、stdin等是FILE *类型,属于标准I/O,在<stdio.h>。

         STDIN_FILENO等是文件描述符,是非负整数,一般定义为0, 1, 2,属于没有buffer的I/O,直接调用系统调用,在<unistd.h>。

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

         使用stdin的函数主要有:fread、fwrite、fclose等,基本上都以f开头
         使用STDIN_FILENO的函数有:read、write、close等

    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就是标准输入设备(一般是键盘)的文件描述符。
         标准C++一级提供的文件操作函数库都是用FILE*来表示文件,stdin就是指向标准输入设备文件的FILE*。

    6、stdin 由标准C库实现, STDIN_FILENO是指0号文件描述符,文件描述符是linux内核(类unix操作系统)专有概念,对文件描述符的操作属于系         统调用,无法在windows或其他系统中找到。在linux下,stdin的实现必然依赖于文件描述符。也就是说这两个东西在不同的层次,一个是用户       层的C库,一个是系统层的系统调用。

    7、 可以这样理解stdin结构中包含了STDIN_FILENO文件描述符。文件描述符是最底层的一个类型,可以用来表示系统中的任何设备,FILE *在          文件描述符的基础上封装了一个机构,里面有相应的缓存信息。

    8、 记住类型不同就ok了,一般linux下面大写的都是数字。就跟宏定义差不多。代表文件描述符。 一般read,write什么的都是对数据进行处理            的。但stdin这种的话,一看就是小写的饿,不是数字,是指针。是句柄。如果学过看过windows编程就知道的。它是一个结构。fopen是封装        过的,用stdin。

    9、 曾经很纳闷,为什么一个整形fd(STDIN_FILENO=0)就可以代表一个打开的文件呢?后来明白了,和我们的手机号是类似的,手机号只是          一个9位数的整形,但是在移动通话网络里,它就可以用来区分不同的手机终端。

  • 相关阅读:
    使用 Spring data redis 结合 Spring cache 缓存数据配置
    Spring Web Flow 笔记
    Linux 定时实行一次任务命令
    css js 优化工具
    arch Failed to load module "intel"
    go 冒泡排序
    go (break goto continue)
    VirtualBox,Kernel driver not installed (rc=-1908)
    go运算符
    go iota
  • 原文地址:https://www.cnblogs.com/alan666/p/8311945.html
Copyright © 2011-2022 走看看