Linux内核解析之标准I/O库
当Linux创建一个进程时,会自动创建3个文件描述符0,1,2,分别对应标准输入,标准输出,错误输出。C库中与文件描述符对应的是文件指针。查看C库头文件stdio.h中的源码
typedef struct _IO_FILE FILE; //文件流类型- extern struct _IO_FILE *stdin; /* 标准输入流 */
extern struct _IO_FILE *stdout; /* 标准输出流 */extern struct _IO_FILE *stderr; /* 错误流 */#ifdef __STDC__/* C89/C99 say they're macros. Make them happy. */#define stdin stdin#define stdout stdout#define stderr stderr#endif
_IO_FILE *stdin = (FILE *) &_IO_2_1_stdin_;_IO_FILE *stdout = (FILE *) &_IO_2_1_stdout_;_IO_FILE *stderr = (FILE *) &_IO_2_1_stderr_;
DEF_STDFILE(_IO_2_1_stdin_, 0, 0, _IO_NO_WRITES);DEF_STDFILE(_IO_2_1_stdout_, 1, &_IO_2_1_stdin_, _IO_NO_READS);DEF_STDFILE(_IO_2_1_stderr_, 2, &_IO_2_1_stdout_, _IO_NO_READS+_IO_UNBUFFERED);
下面进入glibc的源码,查看函数_IO_new_file_fopen来验证上面的结论
_IO_FILE *_IO_new_file_fopen (fp, filename, mode, is32not64)_IO_FILE *fp;const char *filename;const char *mode;int is32not64;{int oflags = 0, omode;int read_write;int oprot = 0666;int i;_IO_FILE *result;#ifdef _LIBCconst char *cs;const char *last_recognized;#endifif (_IO_file_is_open (fp))return 0;switch (*mode){case 'r':omode = O_RDONLY;read_write = _IO_NO_WRITES;break;case 'w':omode = O_WRONLY;oflags = O_CREAT|O_TRUNC;read_write = _IO_NO_READS;break;case 'a':omode = O_WRONLY;oflags = O_CREAT|O_APPEND;read_write = _IO_NO_READS|_IO_IS_APPENDING;break;default:__set_errno (EINVAL);return NULL;}#ifdef _LIBClast_recognized = mode;#endiffor (i = 1; i < 7; ++i){switch (*++mode){case '\0':break;case '+':omode = O_RDWR;read_write &= _IO_IS_APPENDING;#ifdef _LIBClast_recognized = mode;#endifcontinue;case 'x':oflags |= O_EXCL;#ifdef _LIBClast_recognized = mode;#endifcontinue;case 'b':#ifdef _LIBClast_recognized = mode;#endifcontinue;case 'm':fp->_flags2 |= _IO_FLAGS2_MMAP;continue;case 'c':fp->_flags2 |= _IO_FLAGS2_NOTCANCEL;continue;case 'e':#ifdef O_CLOEXECoflags |= O_CLOEXEC;#endiffp->_flags2 |= _IO_FLAGS2_CLOEXEC;continue;default:/* Ignore. */continue;}break;}result = _IO_file_open (fp, filename, omode|oflags, oprot, read_write,is32not64);
#include <stdio.h>FILE *fdopen(int fd, const char *mode);int fileno(FILE *stream);
int fileno (_IO_FILE* fp){CHECK_FILE (fp, EOF);if (!(fp->_flags & _IO_IS_FILEBUF) || _IO_fileno (fp) < 0){__set_errno (EBADF);return -1;}return _IO_fileno (fp);}#define _IO_fileno(FP) ((FP)->_fileno)
Linux内核解析之标准I/O库的更多相关文章
- Linux内核解析
一.Linux内核 一个完整可用的操作系统主要由 4 部分组成:硬件.操作系统内核.操作系统服务和用户应用程序,如下图所示: 用户应用程序:是指那些自处理程序. Inter ...
- Linux内核解析:进程间通信:管道
管道的定义管道的用途管道的操作管道非法read与write内核实现解析管道通信原理及其亲戚通信解析父子进程通信解析亲缘关系的进程管道通信解析管道的注意事项及其性质管道有以下三条性质shell管道的实现 ...
- 决Ubuntu使用`make menuconfig`配置Linux 内核时,出现缺少'ncurses-devel'库支持。
*** Unable to find the ncurses libraries or the *** required header files. *** 'make menuconfig' req ...
- linux内核系统调用和标准C库函数的关系分析
http://blog.csdn.net/skyflying2012/article/details/10044343
- linux内核编程笔记【原创】
以下为本人学习笔记,如有转载请注明出处,谢谢 DEFINE_MUTEX(buzzer_mutex); mutex_lock(&buzzer_mutex); mutex_unlock(& ...
- 《LINUX内核设计与实现》第三周读书笔记——第一二章
<Linux内核设计与实现>读书笔记--第一二章 20135301张忻 估算学习时间:共2小时 读书:1.5 代码:0 作业:0 博客:0.5 实际学习时间:共2.5小时 读书:2.0 代 ...
- 《Linux内核设计与实现》 第三周 读书笔记
第一章 Linux内核简介 1. Unix的历史 Unⅸ虽然已经使用了40年,但计算机科学家仍然认为它是现存操作系统中最强大和最优秀的系统. Unix强大的根本原因: 简洁 在Unix中所有的东西都被 ...
- 《Linux内核设计与实现》读书笔记——第一二章
<Linux内核设计与实现>读书笔记——第一二章 第一章 Linux内核简介 1.1 Unix的历史 简洁:仅提供系统调用并有一个非常明确的设计目的. 抽象:Unix中绝大部分东西都被当做 ...
- Linux内核剖析 之 进程简单介绍
1.概念 1.1 什么是进程? 进程是程序运行的一个实例.能够看作充分描写叙述程序已经运行到何种程度的数据结构的汇集. 从内核观点看.进程的目的就是担当分配系统资源(CPU时间,内存 ...
随机推荐
- 手机web网页的设计
Viewport(视口) 1.视口概念 描述:视口,就是视图窗口的简称,页面中视口大小实际上就是html元素的显示大小 说明:页面想要在移动端加载必须进行视口适配 如果不对页面进行调整,默认页面在 ...
- Linux redis服务搭建记录
Redis的安装 1.安装redis需要C语言的编译环境 //gcc在线安装 yum install gcc-c++ 如果提示 /var/run/yum.pid 已被锁定,解决办法,删除yum.pid ...
- Lecture 2
1. Coordinate(坐标) data for GIS real coordinate system:Cartesian coordinate systems(笛卡尔坐标系) from 3D t ...
- Applied Nonparametric Statistics-lec5
今天继续two-sample test Ref: https://onlinecourses.science.psu.edu/stat464/print/book/export/html/6 Mann ...
- 并查集:CDOJ1594-老司机的奇幻漂流 (食物链)
老司机的奇幻漂流 UESTC - 1594 Problem Description 老司机在救出了女票之后,就和她在全世界旅游,有一天,他们来到了一个神奇的小岛上. 这个小岛上有三种动物,他们互相克制 ...
- UVa 10934 DP Dropping water balloons
首先想一下特殊情况,如果只有一个气球,我们要确定高度只能从下往上一层一层地测试,因为如果气球一旦爆了,便无法测出气球的硬度. 如果气球有无数个,那么就可以用二分的方法来确定. 一般地,用d(i, j) ...
- 洛谷P1085不高兴的津津
- requests与urllib 库
requests库 发送请求: 可以处理所有请求类型:get.post.put.Delete.Head.Options r = requests.get(''https://httpbin.org/' ...
- day01_07.逻辑与字符串运算符
&&(并且)====>发现&符号总是打错,记忆口令:&7(暗器),在数字7上面,在python中是and ||(或者)====>在python中是or . ...
- day01_06.比较运算符
> >= = < <= != == === !== 凡运算,必有运算结果,比较运算符的运算结果是布尔值 ==和===的区别 <?php $c = ( 3 == ...