网站后台制作国际新闻最新消息内容
news/
2025/9/29 11:17:15/
文章来源:
网站后台制作,国际新闻最新消息内容,给小企业做网站多少钱,东莞网站建设营销平台的重定向理解 在Linux下#xff0c;当打开一个文件时#xff0c;进程会遍历文件描述符表#xff0c;找到当前没有被使用的 最小的一个下标#xff0c;作为新的文件描述符。
代码验证#xff1a;
①#xff1a;先关闭下标为0的文件#xff0c;在打开一个文件#xff0c;…重定向理解 在Linux下当打开一个文件时进程会遍历文件描述符表找到当前没有被使用的 最小的一个下标作为新的文件描述符。
代码验证
①先关闭下标为0的文件在打开一个文件此时该文件的fd为0 #includestdio.h#includesys/types.h#includefcntl.h#includestring.h#includeunistd.hint main(){//提前关闭下标为0的文件close(0);int fdopen(log.txt,O_WRONLY|O_CREAT|O_TRUNC,0666);if(fd0){perror(open);return 1;}printf(log.txt打开成功fd:%d\n,fd); close(fd);return 0;}②关闭下标为1的文件在打开一个新的文件再用 printf 打印一段信息 #includestdio.h#includesys/types.h#includefcntl.h#includestring.h#includeunistd.hint main(){//提前关闭下标为1的文件close(1);int fdopen(log.txt,O_WRONLY|O_CREAT|O_TRUNC,0666);if(fd0){perror(open);return 1;}printf(log.txt打开成功fd:%d\n,fd);fflush(stdout); close(fd);return 0;}出现的问题
1.printf输出的内容没有出现在显示器上
2.应该在显示器上出现的信息却被加载到了文件中
【解释】
在上述代码中我们先关闭了下标为1的文件在操作系统中该文件对应的是标准输出显示器而我们打开文件后会将下标1作为该文件的描述符printf函数的作用就是向下标为1的文件中写入信息但是此时下标1对应的不在是标准输出了对应的是我们打开的文件但是上层仍认为1号下标对应的就是显示器所以向1号下标文件写入就相当于向文件写入而这个现象就称之为重定向其本质是在内核中改变文件描述符表特定下标的内容与上层无关 系统调用函数 dup2
该函数的功能是将文件描述符oldfd所对应文件内容拷贝给newfd对应文件
#include unistd.h
int dup2(int oldfd, int newfd);
举例 #includestdio.h#includesys/types.h#includefcntl.h#includestring.h#includeunistd.hint main(){int fdopen(log.txt,O_WRONLY|O_CREAT|O_TRUNC,0666);if(fd0){perror(open);return 1;}dup2(fd,1);printf(hello Linux\n);printf(hello Linux\n);printf(hello Linux\n); fflush(stdout);close(fd);return 0;}缓冲区理解
如果将上述代码中的 fflush(stdout) 删除的话应该向文件写入的信息又写不进去了这又是为什么呢程序结束不是会自动刷新缓冲区吗信息去哪里了 【解释】
在c语言中为了用户使用方便封装了三个结构体stdout、stdin、stderr这三个结构体中除了封装了文件描述符外还存在着语言级别的文件缓冲区
在[Linux]基础IO上--理解文件系统调用、文件描述符、万物皆文件一文中我们谈到每一个文件的struct file都存在一个内核级的文件缓冲区printf输出的内容会先保存在语言级别的那个缓冲区中C语言在通过文件描述符将该缓冲区的内容加载到内核级别的文件缓冲区中操作系统在刷新到外设
此时程序中printf输出的内容就保存在语言级别的文件缓冲区中虽然程序结束时会自动刷新缓冲区但是在程序结束前我们就已经将文件关闭了就无法向文件中写入信息了当程序结束时这部分数据就丢失了 缓冲区刷新策略
1.立即刷新fflush(stdout) int fsync(int fd)
2.行刷新写满一行就刷新显示屏
3.全刷新当缓冲区写满才刷新
4.特殊情况程序结束强制刷新
缓冲区的意义 解耦对于语言级别的文件缓冲区只需要想怎样将数据导入缓冲中不需要管语言怎么再将数据导入内核级文件缓冲区对于内核级文件缓冲区将数据导入进来后就不需要管操作系统怎样将数据刷新到外设中了提高效率系统调用是有一定的成本的当缓冲区写满或者写完一行时再调用系统接口一次或多次的将内容进行处理这样可以极大减少系统调用的次数不仅可以提高IO速率也可以提高用户的使用效率
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/921737.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!