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位数的整形,但是在移动通话网络里,它就可以用来区分不同的手机终端。
stdin和STDIN_FILENO的区别的更多相关文章
- Python中的sys.stdin和input、sys.stdout与print--附带讲解剑指offer42-连续子数组的最大和
2020秋招季,终于开始刷第一套真题了,整套试卷就一道编程题,还是剑指offer上的原题,结果答案死活不对,最后干脆直接提交答案算了,看了下别人的答案,原来是输入数据没有获取的原因,不过这个语法sys ...
- [CSAPP笔记][第十章 系统级I/O]
第十章 系统级I/O 输入/输出(I/O) : 是指主存和外部设备(如磁盘,终端,网络)之间拷贝数据过程. 高级别I/O函数 scanf和printf <<和>> 使用系统级I ...
- Python3 与 C# 并发编程之~进程先导篇
在线预览:http://github.lesschina.com/python/base/concurrency/1.并发编程-进程先导篇.html Python3 与 C# 并发编程之- 进程篇 ...
- APUE—UNIX文件系统
在linux系统中——一切都是文件. 1. 磁盘物理结构 磁盘的物理结构如下: 磁盘由很多盘面组成,而盘面上则是由很多同心圆环组成的磁道,每个磁道又被切割成许多扇区.所有磁盘面的同一个磁道构成一个柱面 ...
- Linux文件IO操作
来源:微信公众号「编程学习基地」 目录 文件操作 Linux文件类型 Linux文件权限 修改文件权限 Linux error 获取系统调用时的错误描述 打印错误信息 系统IO函数 open/clos ...
- Linux系统编程:基本I/O系统调用
文件描述符 进程每打开一个文件的时候,会获得该文件的文件描述符,而后续的读写操作都把文件描述符作为参数.在用户空间或者内核空间,都是通过文件描述符来唯一地索引一个打开的文件.文件描述符使用int类型表 ...
- STDIN_FILENO的作用及与stdin 的区别
1.STDIN_FILENO的作用 STDIN_FILENO属于系统API接口库,其声明为 int 型,是一个打开文件句柄,对应的函数主要包括 open/read/write/close 等系统级调用 ...
- STDIN_FILENO vs stdin
数据类型不一致:stdin类型为 FILE*STDIN_FILENO类型为 int 使用stdin的函数主要有:fread.fwrite.fclose等,基本上都以f开头使用STDIN_FILENO的 ...
- STDIN_FILENO和stdin
title: STDIN_FILENO和stdin date: 2019/03/15 22:03:22 toc: true --- STDIN_FILENO和stdin https://blog.cs ...
随机推荐
- Classloader机制
1.概述? 类加载器:负责.class文件加载到内存中,并为之生成对应的Class对象,也就是字节码对象.这样就可以使用这个类中的成员变量和方法了.而被加载到内存中的class文件就会变成class对 ...
- Centos6.5安装glusterfs3.6.2
硬件环境Centos6.5 glusterfs3.6.2 先安装必要的包 yum install flex bison 2. 下载glusterfs3.6.2 wget http://downloa ...
- 多校HDU5723 最小生成树+dfs回溯
Abandoned country Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others ...
- Windows 7安装PHP运行环境和开发环境
1. 安装Apache 下载地址:http://www.apache.org/dyn/closer.cgi/httpd/binaries/win32 如需更改端口:打开Apache安装目录下conf目 ...
- linux基础(8)-文件处理(awk 、sed、grep)
grep基本用法 格式:grep [选项] [模式] [文件] 选项: -c:只显示有多少行匹配 ,而不具体显示匹配的行 -n:在每一行前面打印该行在文件中的行数 -i:在字符串比较的时候忽略大小 ...
- python爬虫-url
特此声明: 以下内容来源于博主:http://blog.csdn.net/pleasecallmewhy http://cuiq ...
- 【转】jQuery对象与DOM对象之间的转换方法
刚开始学习jquery,可能一时会分不清楚哪些是jQuery对象,哪些是DOM对象.至于DOM对象不多解释,我们接触的太多了,下面重点介绍一下jQuery,以及两者相互间的转换. 什么是jQuery对 ...
- Excel 如何复制粘贴一整行
在某些时候,我们需要重复性的录入一些信息,而且表头都是一样的,一直拉列宽是相当令人烦躁的事情. 所以,就想可以直接复制黏贴出一整行,包括行的各个列宽. 具体操作如图: ——>首先,一整行复制, ...
- 使用Jenkins进行持续集成
首先,我们从Jenkins官方网站https://jenkins.io/下载最新的war包.虽然Jenkins提供了Windows.Linux.OS X等各种安装程序,但是,这些安装程序都没有war包 ...
- openstack nova 基础知识——Quota(配额管理)
一.什么是配额(quota)管理 简单的讲就是控制用户资源的数量.在openstack里,管理员为每一个工程(project)分配的资源都是有一定限制的,这些资源包括实例(instance).cpu. ...