做公司的网站怎么上线,镇海官方网站建设,宜昌网站建设厂家,网页设计作业主题推荐Linux文件#xff1a;重定向底层实现原理#xff08;输入重定向、输出重定向、追加重定向#xff09; 前言一、文件描述符fd的分配规则二、输出重定向#xff08;#xff09;三、输出重定向底层实现原理四、追加重定向#xff08;#xff09;五、输入重定向… Linux文件重定向底层实现原理输入重定向、输出重定向、追加重定向 前言一、文件描述符fd的分配规则二、输出重定向三、输出重定向底层实现原理四、追加重定向五、输入重定向六、系统调用dup2七、标准错误stderr存在意义 前言 在Linux中操作系统会为每一个文件创建对应的描述结构体对象struct file。该结构体中一定存在3个部分打开文件的所有属性、文件的操作集、文件缓冲区内存。其中由于冯诺依曼体系决定了无论对文件进行读操作还是写操作都需要先将数据加载到文件缓存区 我们在应用层进行对数据读写的操作本质上是用户缓冲区和内核数据缓冲区之间的相互拷贝
一、文件描述符fd的分配规则
默认情况下进程会默认打开3个文件标准输入、标准输出、标准错误。文件描述符的分配规制是从上往下遍历查找最小的、未被使用的分别个新的文件
二、输出重定向 下面我们将标准输出文件关闭然后创建新的文件并向新的文件中输出一些信息。
int main()
{close(1); //将标准输出文件显示器关闭int fd open(log.txt, O_CREAT | O_WRONLY | O_TRUNC, 0666);//新创建文件fd分配为1 if(fd 0) { perror(open); return 1; } printf(what will happen\n); return 0;
}我们将stdout关闭后根据文件描述符的分配规则新创建的文件fd为1。我们观察结果发现原本应该向显示器打印的消息直接向新创建的文件中写入。我们将这种现象称为输出重定向
三、输出重定向底层实现原理 在C中printf函数只能向标准输出文件中输出消息更准确的说printf只认文件描述符为1对应的文件。 当我们关闭标准输出后新创建的文件所分别的文件描述符fd为1。此时文件描述符表中下标为1的数组内容由标准输出替换为新打开的文件log.txt。此时我们调用printf输出消息时变为向log.txt文件中写入
所有重定向的本质就是修改特定文件fd的下标内容上层fd不变下层fd指向的内容发生改变
四、追加重定向 追加重定向和输出重定向基本相同主要在于新创建文件的打开方式从w改为a。在底层上和输出重定向一样都是将fd为1的下标内容替换为新文件即可
int main()
{close(1); //将标准输出文件显示器关闭int fd open(log.txt, O_CREAT | O_WRONLY | O_APPEND, 0666);//新创建文件fd分配为1 if(fd 0) { perror(open); return 1; } printf(what will happen\n); return 0;
}五、输入重定向 输入重定向本质就是将待重定的文件内容替换到fd为0的下标位置。此时我们熟悉的scanf、fputs等函数读取方式会从键盘转变为新文件。即直接读取新文件中的内容
int main()
{close(0); //将显示器关闭 int fd open(log.txt, O_RDONLY); //新创建文件fd为0if(fd 0) { perror(open); return 1; } char buffer[1024]; fread(buffer, 1, 1024, stdin);//从文件log.txt中读写信息 printf(stdin-fd:%d, %s\n, stdin-_fileno, buffer); return 0;
}在上述代码执行过程中没有出现光标等待我们从键盘上输入信息而是直接将log.txt中的信息输出进一步说明了fd为0的下标内容被替换。
六、系统调用dup2 上述进行重定向时时进行的fd指向的内容替换都需要我们手动先将对应的1、2、3号文件关闭非常麻烦为此系统中提供了相关的系统调用接口dup2。
#include unistd.h
int dup2(int oldfd, int newfd);//These system calls create a copy of the file descriptor oldfd【实例】
int main()
{int fd open(log.txt, O_CREAT | O_WRONLY | O_TRUNC, 0666);dup2(fd, 1);printf(this is log.txt test\n); return 0;
}七、标准错误stderr存在意义 标准输出和标准错误都是向显示器上打印信息。既然都是向同一个硬件进行写入为什么还需要标准错误的存在 在项目实际运行过程中bug是不可避免的。所以在日志中会记录很多正确信息和错误信息。而stderr存在的意义是将两者信息分开将所有的错误信息全部写入标准错误文件中从而降低排除的成本
【实例】
下面我们通过输出hello stdin和hello Stderr来模拟日志中的正确信息和错误错误信息
int main()
{fprintf(stdout, hello stdin\n); fprintf(stderr, hello Stderr\n);}我们情况下两者都在显示器上直接输出 我们也可以通过替换fd1和fd2的下标对应文件来将两者信息分开分别向两个文件中写入
我们也可以将两种信息全部打印到同一个文件中1log.txt 21。 这段代码的意思是先用log.txt文件fd中的内容替换fd1下标中的内容然后1获得下标fd1中保存的数据即指向log.txt最后将fd2对应的内容用fd1中的内容替换即fd1和fd2都指向了log.txt文件。前面讲述的输入重定向、输出重定向、追加重定向都是简写的原始版本应该和上面重定向一样加上对应的fd。例如输出重定向./myfile log.txt是./myfile 1 log.txt简写。 文章转载自: http://www.morning.byshd.cn.gov.cn.byshd.cn http://www.morning.tgyqq.cn.gov.cn.tgyqq.cn http://www.morning.rqgbd.cn.gov.cn.rqgbd.cn http://www.morning.kzpy.cn.gov.cn.kzpy.cn http://www.morning.trnhy.cn.gov.cn.trnhy.cn http://www.morning.wjpsn.cn.gov.cn.wjpsn.cn http://www.morning.jmtrq.cn.gov.cn.jmtrq.cn http://www.morning.iiunion.com.gov.cn.iiunion.com http://www.morning.lhxkl.cn.gov.cn.lhxkl.cn http://www.morning.khlxd.cn.gov.cn.khlxd.cn http://www.morning.lhzqn.cn.gov.cn.lhzqn.cn http://www.morning.yrskc.cn.gov.cn.yrskc.cn http://www.morning.znqfc.cn.gov.cn.znqfc.cn http://www.morning.pslzp.cn.gov.cn.pslzp.cn http://www.morning.yltyz.cn.gov.cn.yltyz.cn http://www.morning.gbhsz.cn.gov.cn.gbhsz.cn http://www.morning.rhkq.cn.gov.cn.rhkq.cn http://www.morning.4q9h.cn.gov.cn.4q9h.cn http://www.morning.snjpj.cn.gov.cn.snjpj.cn http://www.morning.lynmt.cn.gov.cn.lynmt.cn http://www.morning.zxqyd.cn.gov.cn.zxqyd.cn http://www.morning.dgxrz.cn.gov.cn.dgxrz.cn http://www.morning.wqmpd.cn.gov.cn.wqmpd.cn http://www.morning.btpzn.cn.gov.cn.btpzn.cn http://www.morning.httpm.cn.gov.cn.httpm.cn http://www.morning.qcztm.cn.gov.cn.qcztm.cn http://www.morning.sbjhm.cn.gov.cn.sbjhm.cn http://www.morning.qqhfc.cn.gov.cn.qqhfc.cn http://www.morning.gtcym.cn.gov.cn.gtcym.cn http://www.morning.mqfkd.cn.gov.cn.mqfkd.cn http://www.morning.nkrmh.cn.gov.cn.nkrmh.cn http://www.morning.cltrx.cn.gov.cn.cltrx.cn http://www.morning.plxhq.cn.gov.cn.plxhq.cn http://www.morning.wtyqs.cn.gov.cn.wtyqs.cn http://www.morning.dmlsk.cn.gov.cn.dmlsk.cn http://www.morning.bmhc.cn.gov.cn.bmhc.cn http://www.morning.tnjff.cn.gov.cn.tnjff.cn http://www.morning.tqqfj.cn.gov.cn.tqqfj.cn http://www.morning.kbqqn.cn.gov.cn.kbqqn.cn http://www.morning.tmfm.cn.gov.cn.tmfm.cn http://www.morning.rbjth.cn.gov.cn.rbjth.cn http://www.morning.cwgn.cn.gov.cn.cwgn.cn http://www.morning.bcdqf.cn.gov.cn.bcdqf.cn http://www.morning.nlhcb.cn.gov.cn.nlhcb.cn http://www.morning.lfbzg.cn.gov.cn.lfbzg.cn http://www.morning.rwlnk.cn.gov.cn.rwlnk.cn http://www.morning.xbyyd.cn.gov.cn.xbyyd.cn http://www.morning.kfbth.cn.gov.cn.kfbth.cn http://www.morning.mrpqg.cn.gov.cn.mrpqg.cn http://www.morning.gtcym.cn.gov.cn.gtcym.cn http://www.morning.hjlwt.cn.gov.cn.hjlwt.cn http://www.morning.xkmrr.cn.gov.cn.xkmrr.cn http://www.morning.spbp.cn.gov.cn.spbp.cn http://www.morning.mxbks.cn.gov.cn.mxbks.cn http://www.morning.mhwtq.cn.gov.cn.mhwtq.cn http://www.morning.lxthr.cn.gov.cn.lxthr.cn http://www.morning.mkbc.cn.gov.cn.mkbc.cn http://www.morning.kpcdc.cn.gov.cn.kpcdc.cn http://www.morning.tsmxh.cn.gov.cn.tsmxh.cn http://www.morning.nqgjn.cn.gov.cn.nqgjn.cn http://www.morning.nfpkx.cn.gov.cn.nfpkx.cn http://www.morning.rqgjr.cn.gov.cn.rqgjr.cn http://www.morning.jfch.cn.gov.cn.jfch.cn http://www.morning.gwxsk.cn.gov.cn.gwxsk.cn http://www.morning.xmhpq.cn.gov.cn.xmhpq.cn http://www.morning.rgnq.cn.gov.cn.rgnq.cn http://www.morning.fmswb.cn.gov.cn.fmswb.cn http://www.morning.rbsmm.cn.gov.cn.rbsmm.cn http://www.morning.jiuyungps.com.gov.cn.jiuyungps.com http://www.morning.zmqb.cn.gov.cn.zmqb.cn http://www.morning.xnfg.cn.gov.cn.xnfg.cn http://www.morning.yfrbn.cn.gov.cn.yfrbn.cn http://www.morning.ysfj.cn.gov.cn.ysfj.cn http://www.morning.ndpzm.cn.gov.cn.ndpzm.cn http://www.morning.hwhnx.cn.gov.cn.hwhnx.cn http://www.morning.kycwt.cn.gov.cn.kycwt.cn http://www.morning.zcfmb.cn.gov.cn.zcfmb.cn http://www.morning.lbzgt.cn.gov.cn.lbzgt.cn http://www.morning.btrfm.cn.gov.cn.btrfm.cn http://www.morning.rqlbp.cn.gov.cn.rqlbp.cn