加强信息网站建设,代理怎么引流推广,内蒙旅游,国内建站源码hello~ 很高兴见到大家! 这次带来的是Linux系统中关于基础 IO这部分的一些知识点,如果对你有所帮助的话,可否留下你宝贵的三连呢? 个 人 主 页: 默|笙 文章目录一、理解重定向本质1.1 linux分配文件描述符遵循最小可用原则- - -分配规则1.2 IO函数只认文件描述符#xff0c;不…hello~ 很高兴见到大家! 这次带来的是Linux系统中关于基础 IO这部分的一些知识点,如果对你有所帮助的话,可否留下你宝贵的三连呢?个 人 主 页: 默|笙文章目录一、理解重定向本质1.1 linux分配文件描述符遵循最小可用原则- - -分配规则1.2 IO函数只认文件描述符不认特定的文件1.3 dup2系统调用二、初步认识一切皆文件一、理解重定向本质1.1 linux分配文件描述符遵循最小可用原则- - -分配规则在之前的学习中我们知道每一个进程运行之后都会默认打开三个文件分别是标准输入流标准输出流和标准错误流它们分别对应文件描述符0、1、2。而进程新打开的文件则会分配从3开始依次往后的文件描述符。10intfdaopen(log.txt1,O_WRONLY|O_CREAT|O_TRUNC,0666);11intfdbopen(log.txt2,O_WRONLY|O_CREAT|O_TRUNC,0666);12intfdcopen(log.txt3,O_WRONLY|O_CREAT|O_TRUNC,0666);13printf(fda: %d\n,fda);14printf(fdb: %d\n,fdb);15printf(fdc: %d\n,fdc);如果我们人为将这三个默认打开的文件关闭再打开一个新的文件log.txt会怎么样—关闭标准输入流文件那么文件描述符为0的位置就会空出来这个时候3就不是最小且可以分配的文件描述符了也就是说log.txt的文件描述符会是0而不是3。可以通过下面的代码进行验证9close(0);10intfpopen(log.txt,O_WRONLY|O_CREAT|O_TRUNC,0666);11printf(fp: %d\n,fp);1.2 IO函数只认文件描述符不认特定的文件C语言里面stdin、stdout和stderr都是对文件描述符fd的抽象封装这也就意味着这三个流它们是不认识这些文件描述符所对应的文件的。一般stdin对应键盘文件stdout和stderr对应显示器文件。如果将这些fd对应的文件替换掉是不是就能够实现从其他文件进行输入输出了呢是的。我们可以用下面这段代码进行验证10close(1);11intfpopen(log.txt,O_WRONLY|O_CREAT|O_TRUNC);12printf(fp: %d\n,fp);这里可以看到如果我们把标准输出流关闭之后printf要打印的内容在test执行之后没有显示在显示器上而是打印到了log.txt文件里面这是因为printf这个io函数它只认文件描述符1它会把内容打印到文件描述符1对应的文件里面。在把标准输入流关闭打开一个新文件log.txt之后文件描述符1就归log.txt这个文件了printf要打印的内容自然就会打印到文件log.txt里面而非显示器文件了。这就是为什么我们执行test看不到打印的内容而查看log.txt文件能够看到打印内容的原因。我们通过关闭原来的输入输出流然后打开新的文件来代替要进行IO操作的显示器键盘文件来实现对不同的文件输入输出。不过现在一般是先打开新文件然后将这个新文件覆盖掉原来的输入输出流对应文件。替换原输入输出流键盘 / 显示器对应的文件描述符0/1/2来达到对其他文件的IO操作这就是重定向的本质。这里替换标准输入流对应文件也是一样它不会再从键盘读取数据而是从文件描述符0对应的文件里面读取数据。10close(0);11intfpopen(log.txt,O_RDONLY);12printf(fp: %d\n,fp);13chars[10];14scanf(%s,s);15printf(%s\n,s);事先我往已经存在的文件 log.txt 输入了一串字符helloworld然后将文件描述符0对应的文件改为log.txt之后用scanf读取log.txt文件内容再打印到显示器上如果我们不改变文件描述符0对应文件那么它应该从键盘读取数据改变之后自然就从log.txt文件里面读取数据了。1.3 dup2系统调用dup2这个接口就是专门用来改变文件描述符的它的原理是进行覆盖即用oldfd对应的文件覆盖newfd原本的绑定关系。比如上面我们用 log.txt代替了文件描述符0/1对应的文件那么log.txt对应的文件描述符就是oldfd而文件描述符0/1就是newfd。有了这个函数就不用通过关闭再打开文件进行替换操作而是直接进行覆盖。10.进行程序替换是不会影响到进程已经打开的文件的。二、初步认识一切皆文件我们知道Linux系统里面一切皆文件那么硬件在Linux系统里面也会是一个文件。OS要对这些硬件文件进行管理一定也是先描述再组织也就是把硬件的属性等其他内容打包成一个结构体struct_file。对每个硬件进行操作其实无非两种输入和输出操作即IO操作。但是每一个硬件设备它们的访问方式都各不相同比如键盘是输入它的输出操作没有意义显示器则与之相反。每一个硬件设备都有自己的输入和输出操作驱动方法要让OS对这些硬件以及其他文件进行统一操作就需要对struct_file进行改造加入operations模块绑定对应专属的IO操作这样就实现了对不同的硬件进行统一操作。它类似于c里面的多态。今天的分享就到此结束啦,如果对读者朋友们有所帮助的话,可否留下宝贵的三连呢~~让我们共同努力, 一起走下去!