文件描述符:

关于这些:此处这里讲的十分的详细,清晰,膜拜大佬 Linux 中有这样一句话,万物皆可文件;
1、对于内核而言,所有打开文件都由文件描述符引用,文件描述符是一个非负整数,当打开一个现存文件或者创建一个新文件时,内核向进程返回一个文件描述符,当读写一个文件时,用 open()和 creat()返回文件描述符标识该文件,将其作文参数,传递给 read 和 write 。

而在Linux 系统中,有默认文件描述符
0 标准输入
1 标准输出
2 标准错误输出
给了三个宏定义:
0:STDIN_FILENO
1:STDOUT_FILENO
2:STDERR_FILENO

在之前的代码中,我们能够发现,printf("%d",fd);结果都是从3开始,那么0 1 2是什么呢?

其实是这样的,在程序刚开始运行时,有三个文件被自动打开了,占用了 0 1 2 这三个描述符:
依次打开的三个文件分别是/dev/stdin,/dev/stdout,/dev/stderr

程序开始运行时,默认会调用open("/dev/stdin", O_RDONLY)将其打开,返回的文件描述符是0
在打开这个以后,再执行:open("/dev/stdout", O_WRONLY); 所以这个文件的返回值自然是 1

使用0这个文件描述符,可以从键盘输入的数据简单理解就是,/dev/stdin这个文件代表了键盘。

所以就可以使用 read() 来达到类似于 scanf() 的结果,读取键盘输入的字符,放到缓存的 readbuf 中
其实 scanf() 这个库函数就是在调用 read() 只是从 read() 读取的内容往往只能是字符串,而若想将其从字符串转化为 整型,浮点型等,则(反正我不会搞)
其实如果你在代码中输入了 close(0); 你会发现,你的 scanf() 函数立马抓瞎,当场报废。

而 /dev/stdout:标准输出文件,fd = 1;则代表了 显示器,所以可以将 readbuf 中的数据写到屏幕上。
其实:printf()下层调用的就是 write 函数。
同理,之所以使用 printf() 而不是write() 的原因,就是因为
库函数可以很好的兼容不同的OS
封装时,叠加了很多的功能,比如格式化转换通过指定%d、%f等,自动将其换为对应的字符,然后write输出,完全不用自己来转换。printf使用%s、%c输出字符串和字符时,其实不用转,因为要输出的本来就是字符,printf直接把字符给write就行了,当然也不是一点事情也不做,还是会做点小处理的。

头文件就不打了

int main(){
	int fd;
	char readbuf[128];
	int n_read = read(0,readbuf,5);
	int n_write = write(1,readbuf,strlen(readbuf));
	
		
	return 0;
}

android文件描述符泄露 文件描述符012_文件描述符