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位数的整形,但是在移动通话网络里,它就可以用来区分不同的手机终端。

  • 相关阅读:
    memcached 服务器安装
    农行接口开发
    mysql备份
    IIS下的FTP使用
    建行接口
    Android网络编程之一个Android下菜单系统模块的实现(客户端—更新菜单)
    Android网络编程之一个Android下菜单系统模块的实现(客户端—更新桌号)
    Android网络编程之下菜单系统中的真机调试问题小结
    Android网络编程之一个Android下菜单系统模块的实现(服务器端—更新桌号)
    Android之一个简单的Activity启动画面
  • 原文地址:https://www.cnblogs.com/alan666/p/8311945.html
Copyright © 2011-2022 走看看