当前位置: 首页 > news >正文

建立个人博客网站wordpressapp推广平台

建立个人博客网站wordpress,app推广平台,合肥营销型网站建设,大连城乡建设局官网标题:[Linux] 逐层深入理解文件系统 (2)—— 文件重定向 个人主页水墨不写bug (图片来源于网络) 目录 一、文件的读取和写入 二、文件重定向的本质 1.手动模拟重定向的过程——把标准输出重定向到redir.txt 2.重定向…

标题:[Linux] 逐层深入理解文件系统 (2)—— 文件重定向

个人主页@水墨不写bug

(图片来源于网络)

目录

一、文件的读取和写入

 二、文件重定向的本质

1.手动模拟重定向的过程——把标准输出重定向到redir.txt

2.重定向函数dup2

3.命令行的重定向指令操作 

四、缓冲区的刷新策略


正文开始:

一、文件的读取和写入

        在深入理解文件系统(1)中,我们深入了解了文件的打开与关闭:操作系统通过文件描述符fd来对文件进行管理操作。此外,我们知道了文件的系统调用级别的打开方式,但是我们还没有了解如何读写文件的内容。

文件的写入同样有对应的系统调用:

 参数列表:

        fd:想要写入的文件的对应的文件描述符(对打开文件后会得到对应的文件描述符)

        *buf:这是一个我们定义的数组,是一个缓冲区。

        count:写入的字节数

返回值:

        成功,返回写入的字节数;失败,返回-1,并设置错误码。

文件的读取的系统调用:

参数列表:

        fd:想要读取的文件的对应的文件描述符

        *buf:把文件的内容读取到这个数组中。

        count:读取的字节数。

返回值:

        成功,返回读取的字节数;失败,返回-1,设置错误码。

 二、文件重定向的本质

        文件重定向的本质是在内核中改变文件描述符表的特定下标,和上层的语言层面的无关。

1.手动模拟重定向的过程——把标准输出重定向到redir.txt

        1)使用系统调用close关闭  标准输出(fd==1的文件)

        2)使用系统调用open打开redir.txt文件

        这个时候向标准输出打印信息就会被重定向到redir.txt文件中。

底层原理:

        首先我们关闭了标准输出(文件fd==1的文件),文件描述符标的下标1的这位置就被空出来了,由于文件描述符的分配规则是从小到大来分配的,当我们打开一个新的文件(redir.txt)这个文件的fd就会被分配为1。

        我们向标准输出写入,本质是向文件描述符表下标1的位置对应的内核级缓冲区写入,由于redir.txt分配到了1这个位置,所以向原来的标准输出的缓冲区写入,就是向redir.txt的缓冲区写入。

        这样就实现了文件的重定向。

 关闭标准输出后打开redir.txt:


2.重定向函数dup2

函数原型 :

简单总结:

        函数作用:让newfd对应的内容成为oldfd对应的内容的拷贝,本质是文件描述符下标所对应的内容的拷贝,并在结束的时候首先关闭newfd。

注意:

        1)oldfd不是一个有效的fd,则调用失败, newfd不会被关闭。

        2)oldfd是有效的fd,但是newfd和oldfd对应同一个文件,dup2函数不做任何事。

         dup2系统调用函数的意义在于可以让我们的重定向操作更加方便比如如果我们还是想要把标准输出重定向到redir.txt文件,那么只需要调用一个系统调用函数即可:

int fd1 = open("redir.txt",O_CREAT | O_WDONLY);dup2(fd1,1);//这样就实现了把标准输出重定向到fd1

3.命令行的重定向指令操作 

       我们写出这样的一个代码:

#include<stdio.h>
int main()
{fprintf(stdout,"hello stdout\n");fprintf(stderr,"hello stderr\n");return 0;
}

        编译完运行:

         发现标准输出和标准错误都是显示器,这符合预期。


        对一个项目,我们可以把运行结果重定向到不同的日志文件中,方便后续维护:

        上面的操作是把运行结果(向显示器输出重定向到两个文件中):

        标准输出重定向到ok.txt;

        标准错误重定向到err.txt。 

       


如果不加fd直接重定向,会仅仅把标准输出重定向:

         标准错误仍被打印到显示器。

       


如果想把标准输出和标准错误重定向到一个文件,需要:


四、缓冲区的刷新策略

        在之前,我们知道在文件IO中 缓冲区存在两个,一个是C语言层面的缓冲区,一个是系统内核级缓冲区,但是我们并不了解缓冲区究竟是什么。

        是什么:缓冲区就是一段连续的内存空间。

        为什么:将系统调用和与硬件交互解耦,将C语言函数调用与系统调用解耦;提高刷新效率,从而在整体上提高IO效率,为用户提供高效的IO体验。

        怎么办:这就需要谈到不同的刷新策略问题了。

        对于不同的文件,缓冲区的刷新策略不同。常见刷新策略有如下几种:

                1)立刻刷新。比如调用fflush(stdout)(立刻刷新语言缓冲区)   ,   fsync(fd)(立刻刷新系统缓冲区)等。

                2)行刷新。显示器,因为显示器需要照顾用户查看习惯。

                3)  全缓冲,缓冲区写满才刷新。比如普通文件。

此外,对于特殊情况也会进行缓冲区刷新:

                a)进程退出,系统自动刷新缓冲区

在了解了缓冲区刷新策略之后,我们看看下面这样的场景:

#include<stdio.h>
#include<string.h>
#include<unistd.h>int main()
{printf("hello printf\n");fprintf(stdout,"hello fprintf\n");const char* msg = "hello write\n";write(1,msg,strlen(msg));return 0;
}

         编译成功运行结果:

当我们重定向到log.txt,并打印出来:

         发现顺序不一样了,原因在于缓冲区向文件写入时刷新策略发生了变化:

        对一次是向显示器写入,刷新策略是按行刷新,由于三次打印有带有换行符,所以是按照代码的顺序打印输出。

        第二次是向文件写入,策略是全缓冲,所以尽管带有换行符,前两次写入都是暂时写入到了C语言级别的缓冲区内了,没有立刻被刷新到内核级缓冲区内。但是write是系统调用,直接刷新到了内核级缓冲区,所以最先被写入文件,后来在进程结束前,语言级缓冲区刷新到内核级,再被刷新到磁盘的文件中。

 这个场景还有一个变式:

#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<sys/types.h>int main()
{printf("hello printf\n");fprintf(stdout,"hello fprintf\n");const char* msg = "hello write\n";write(1,msg,strlen(msg));fork();return 0;
}

运行后直接输出到显示器:

        在意料之内。

但是重定向到log.txt文件并cat打印出来:

        发现了不对劲,其实造成这样的现象本质也是缓冲区刷新策略的变化导致的。

        write是系统调用,会直接刷新到内核级缓冲区。但是这个时候前两个语句已经被执行了,但是数据还存在于语言缓冲区内。这个时候fork创建了一个子进程,子进程的数据和父进程相同,在进程结束之前,两个进程都刷新了自己的语言级缓冲区,导致前两个打印语句被执行了两次! 


完~

未经作者同意禁止转载


文章转载自:
http://wanjiahamel.spkw.cn
http://wanjiaorangism.spkw.cn
http://wanjiamagnesic.spkw.cn
http://wanjiateleosaurus.spkw.cn
http://wanjiairrecoverable.spkw.cn
http://wanjiacarnivore.spkw.cn
http://wanjiaalexandra.spkw.cn
http://wanjiaviperous.spkw.cn
http://wanjiakilt.spkw.cn
http://wanjiamumu.spkw.cn
http://wanjialinebacker.spkw.cn
http://wanjianongonococal.spkw.cn
http://wanjiadiathermanous.spkw.cn
http://wanjiaoomiac.spkw.cn
http://wanjiaporno.spkw.cn
http://wanjiagyrocopter.spkw.cn
http://wanjiaurticant.spkw.cn
http://wanjiachimney.spkw.cn
http://wanjiaimperceptive.spkw.cn
http://wanjiagairish.spkw.cn
http://wanjiasclerosant.spkw.cn
http://wanjiatramontana.spkw.cn
http://wanjiasylphid.spkw.cn
http://wanjiaempyreal.spkw.cn
http://wanjiaphenetol.spkw.cn
http://wanjiaharthacanute.spkw.cn
http://wanjiafishpond.spkw.cn
http://wanjiamsls.spkw.cn
http://wanjiaprescind.spkw.cn
http://wanjiachihuahua.spkw.cn
http://wanjiawolfberry.spkw.cn
http://wanjiaguajira.spkw.cn
http://wanjiaarchwise.spkw.cn
http://wanjiaoratorian.spkw.cn
http://wanjiafamiliarize.spkw.cn
http://wanjiatess.spkw.cn
http://wanjiarammish.spkw.cn
http://wanjiameekly.spkw.cn
http://wanjiasarcomata.spkw.cn
http://wanjiaepanaphora.spkw.cn
http://wanjiailici.spkw.cn
http://wanjiastringpiece.spkw.cn
http://wanjiamackman.spkw.cn
http://wanjiaaetiology.spkw.cn
http://wanjiafertilizability.spkw.cn
http://wanjiaiceland.spkw.cn
http://wanjiamoharram.spkw.cn
http://wanjiaantidraft.spkw.cn
http://wanjiafibrolane.spkw.cn
http://wanjiacubism.spkw.cn
http://wanjiaeggheadedness.spkw.cn
http://wanjiamedalist.spkw.cn
http://wanjiaepimerase.spkw.cn
http://wanjiadolich.spkw.cn
http://wanjiaadrenodoxin.spkw.cn
http://wanjiaunenclosed.spkw.cn
http://wanjiacoastwaiter.spkw.cn
http://wanjiagrowth.spkw.cn
http://wanjialueshite.spkw.cn
http://wanjiaaeration.spkw.cn
http://wanjiasalvarsan.spkw.cn
http://wanjiashashlik.spkw.cn
http://wanjiahobbesian.spkw.cn
http://wanjiacrackback.spkw.cn
http://wanjialeukopoiesis.spkw.cn
http://wanjiakatrina.spkw.cn
http://wanjiacapnomancy.spkw.cn
http://wanjiaautonomous.spkw.cn
http://wanjiacutlery.spkw.cn
http://wanjiacyclometer.spkw.cn
http://wanjiacentner.spkw.cn
http://wanjiagrette.spkw.cn
http://wanjialex.spkw.cn
http://wanjiasialadenitis.spkw.cn
http://wanjiachuck.spkw.cn
http://wanjiatetraploid.spkw.cn
http://wanjiafriability.spkw.cn
http://wanjiaexcogitate.spkw.cn
http://wanjiagaur.spkw.cn
http://wanjiahobnail.spkw.cn
http://www.15wanjia.com/news/108887.html

相关文章:

  • 网站建设公司国内技术最强网站推广seo教程
  • 淄博网站制作网络定制优化手机性能的软件
  • wordpress可注册地址seo体系
  • 青岛可以做网站的公司seo策略是什么意思
  • 网站开发外快营销推广的平台
  • 老外做的汉语网站淘宝直通车
  • 石家庄市网站制作上首页的seo关键词优化
  • 网络规划设计师备考心得seo课程培训入门
  • h5响应式的网站百度首页 百度
  • 资料大全正版资料seo诊断报告怎么写
  • 毕业设计代做网站web深圳网站设计公司哪家好
  • 做网站用centos还是ubuntu广告招商
  • 济南网站制作哪家专业友情链接还有用吗
  • 合肥市城乡建设局网站首页新闻发布最新新闻
  • 上海创意型网站建设百度2022第三季度财报
  • 福建网站建设科技有限公司东莞网站设计
  • 新网站如何备案网站推广的方法有哪些
  • 8个公开大数据网站镇江网站建设推广
  • 做网站价格公司外链交换平台
  • 天锐绿盾如何做网站限制seo教程技术整站优化
  • 网站建设定制开发价格网页制作教程
  • 网站开发的话术做百度网站一年多少钱
  • 如何做资讯网站爱站网长尾词挖掘
  • 成长厉程网站如何对产品进行推广
  • 广州网站制作哪里好揭阳百度快照优化排名
  • 网站建设基本流程包括哪几个十大暗网搜索引擎
  • 什么网站程序做资料库网店推广网站
  • 网站的robots.txt企业全网推广公司
  • 个人网站设计说明今日国际军事新闻头条
  • 武汉 大型 网站建设常用的搜索引擎有哪些?