我们知道文件描述符是整型的,哪为什么是整型的呢,在系统中那些函数 如 open read 怎么来通过一个整型的数值来确定,这个是我要打开的文件呢,抱着这几个问题我们来分析下。
Linux中一切皆文件,所以io的操作是关键的,这些io操作又分为 标准io 和 和系统调用io ,标准io的库我们打的最多 就是
#include<stdio.h>
FILE 的文件指针,还有 fopen 文件打开 fread … 这些大家都应该很熟悉,这些都是围绕FILE文件指针来操作的,还有需要补充的是就是 标准io是依赖于系统调用io,可以吧标准io是系统io的一个封装。
系统调用io,也是在学Linux中才知道的,系统io操作的不是FILE指针,而是文件描述符,文件描述符是个整型变量,没错就是个数字,每一个进程(不清楚的可以理解为一个程序吧)都有自己的标准输入文件、标准输出文件和标准出错文件(应该是系统自动分配的)。每一个文件描述符会与一个打开文件相对应,同时,不同的文件描述符也会指向同一个文件。而且系统默认自动为进程的标准输入文件在文件描述符0上打开,标准输出文件在文件描述符1上打开,标准出错在文件描述符2上打开。通常情况下,
是将输入设备(键盘)打开并复制到进程的标准输入(0)、将输出设备(显示器)打开并复制到标准输出(1)和标准出错(2)。
每一个文件描述符会与一个打开文件相对应,同时,不同的文件描述符也会指向同一个文件。相同的文件可以被不同的进程打开也可以在同一个进程中被多次打开。
文件描述符怎么是个整数呢,为什么不是个指针?
我们先看看标准操作是怎样的
通过FILE指针操作这个一个结构体继而操控文件(还有很多细节,说个大概吧)。FILE是个指针,我们把FILE这个指针放在一个数组里,这个数组的下标,就这个FILE指针操控的文件,
FILE指针放在数组下标为3的空间,前面我们说了 0 1 2 是打开进程是就调用的了,这下就比较好明白文件描述符了吧…
我写个程序说明下,在标准io中 常量stdin 和 stdout 分别表示 标准输入 和标准输出
/*************************************************************************
> File Name: 2-1-5.c
> Author:hrp
> Mail:
> Created Time: 2020年06月07日 星期日 21时44分54秒
************************************************************************/
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
char c;
while( (c = getc(stdin)) != EOF ) //从标准输入(键盘上输入的)读取字符给c
{
if(putc(c,stdout) == EOF) //从键盘上输入的在打印(输出)一遍在屏幕上
printf("error");
}
exit(0);
}
标准输入就是你键盘上输入的字符,标准输出就是屏幕上显示的字符