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

网站变慢的原因360搜索引擎首页

网站变慢的原因,360搜索引擎首页,求职seo推荐,网站制作是不是要先用ps做目录 前言1. 理解C语言的文件接口2. 操作文件的系统调用接口2.1 open函数详解2.2 close函数详解2.3 write函数详解2.4 read函数详解 3. 文件描述符fd详解4. 文件描述符的内核本质5. 怎样理解Linux下一切皆文件?6. 理解输出输入重定向7. 重定向的系统调用8. 总结 前言 “在Lin…

目录

  • 前言
  • 1. 理解C语言的文件接口
  • 2. 操作文件的系统调用接口
    • 2.1 open函数详解
    • 2.2 close函数详解
    • 2.3 write函数详解
    • 2.4 read函数详解
  • 3. 文件描述符fd详解
  • 4. 文件描述符的内核本质
  • 5. 怎样理解Linux下一切皆文件?
  • 6. 理解输出输入重定向
  • 7. 重定向的系统调用
  • 8. 总结

前言

“在Linux系统下,一切皆文件”,相信你也听过这句话,,那么怎样理解这句话呢?学会这篇文字,你就能理解了。

本章重点:

本篇文章着重讲解I/O的四个系统调用接口, 以及文件描述符fd的认识与fd的本质, 最后讲解应该怎样理解Linux下一切皆文件这一说法.在此之前,会先复习一下C语言的文件相关的库函数。

1. 理解C语言的文件接口

首先C\C++程序会默认打开stdin,stdout和stderr三个标准文件方便程序员直接进行读写.

但是显然有点不对劲, 我们平时使用printf和scanf时是从显示器中显示和从键盘输入, 是不是代表显示器和键盘在OS内部其实也可以看作文件?是的,向显示器打印和向磁盘写入无本质区别!

C语言打开文件的方式: fopen
C语言的读取: fread, fscanf, fgets
C语言的写入: fwrite, fprintf, fputs

fopen的返回值和三个标准文件类型都是FILE*

2. 操作文件的系统调用接口

每个语言都有一套自己的文件操作函数,但不管上层语言怎样变化,它都是封装了系统调用,所以文件的系统调用很重要!

一共四个函数:
1.open: 打开文件
2.close: 关闭文件
3.write: 向文件写入
4.read: 从文件中读取

2.1 open函数详解

在这里插入图片描述
open函数的解释如下:
在这里插入图片描述

这个flag比较特殊,虽然它是整型,但是内部却当作了位图在使用,即传递过来的选项会被当作位图中的不同位,通过判断某位是否为1来查看是否有这个选项.

open的选项(实际上是宏定义的整数)
在这里插入图片描述
open的用法: 多个选项用或|分割

int fd = open("/home/cc/test.txt",O_WRONLY | O_CREAT);

2.2 close函数详解

在这里插入图片描述
close函数很简单,意思就是关闭文件描述符fd对应的文件, 调用成功返回0.

2.3 write函数详解

在这里插入图片描述
write是向文件描述符fd对应的文件中写入数据, 数据的来源是buf, 要写入的字节数是count, 调用成功返回写入到文件中的字节数.

write的一般用法:

char* buffer = "abcdef";
int fd = open("/home/cc/text.txt",O_WRONLY);
write(fd,buffer,sizeof(buffer));

2.4 read函数详解

在这里插入图片描述
read是从文件描述符fd对应的文件中读取数据, 将数据读取到buf中,要读取的长度是count, 调用成功返回读取到的字节数.

read的一般用法:

char buffer[1024];
int fd = open("/home/cc/text.txt",O_WRONLY);
ssize_t n = read(fd,buffer,sizeof(buffer));
if(n > 0)buffer[n] = '\0';//将字符串变成C语言风格,以\0结尾

3. 文件描述符fd详解

我们知道文件描述符是一个整数,那么它是否有什么规律呢?请看下面的代码:

int fd1 = open("/home/kwy/text1.txt",O_WRONLY | O_CREAT);
int fd2 = open("/home/kwy/text2.txt",O_WRONLY | O_CREAT);
int fd3 = open("/home/kwy/text3.txt",O_WRONLY | O_CREAT);
int fd4 = open("/home/kwy/text4.txt",O_WRONLY | O_CREAT);
printf("%d, %d, %d, %d",fd1,fd2,fd3,fd4);

会发现fa1,2,3,4的整数值分别是:
3,4,5,6,这是为什么?需要回答两个问题:

1. 0号1号和2号描述符去哪儿了?
2. 文件描述符的增长规律是什么?

首先, 在最开始说过C/C++程序会默认打开stdin, stdout, stderr三个标准文件,所以其实0,1,2号文件描述符就是这三个标准文件.

其次, 0,1,2被使用后, 后面的文件描述符会从3开始, 依次+1, 一共创建到6号描述符,若此时将3号文件描述符关闭,下次打开文件对应的描述符就是3,而不是7!

可以使用下面的代码来验证第一个猜想:

//向屏幕打印信息
const char* str = "abcdef";
write(1, str, strlen(str));
//从屏幕读取信息
char buffer[1024];
int n = read(0, buffer, sizeof(buffer));
if(n > 0)buffer[n] = '\0';

4. 文件描述符的内核本质

进程想要访问某个文件的前提是打开文件,在操作系统内可能会有很多个打开的文件,OS为了维护这些资源,需要对它进行管理,会为每个打开的文件创建struct file结构体, 再用链表将这些结构体连接起来.
在这里插入图片描述

这是文件在OS内部的管理体系,而每个进程都要知道自己打开了哪些文件, 所以进程PCB中会保存一张文件描述符表(本质是结构体指针),这个表中存放了这个进程打开的所有文件!
在这里插入图片描述

从这个图中可以看见, 文件描述符的本质其实就是数组的下标,每次打开文件会去数组中扫描,找到最近的没有被使用的下标!

5. 怎样理解Linux下一切皆文件?

首先,底层不同的硬件如磁盘,显卡,键盘等一定对应了不同的操作方法,但这些设备的核心功能就是读写,也就是I/O.

在这里插入图片描述
操作系统会为每一个底层硬件创建struct file结构体,此结构体中一定包含了两个函数指针,分别指向这个硬件对应的读方法和写方法.

所以当我们使用键盘或打开显示器时,就会有对应的指针指向对应的那个方法。
所以当我们使用键盘时,0S就会去找到那个structfile,并且找到里面的方法调用。当我们从 struct file 的角度向上看时,就不用关心底层外设的差异了,操作它们的方法都是:read/write的函数指针,在上层我们看到是所有设备就叫做 一切皆文件!

6. 理解输出输入重定向

根据上面的推论,如果我先把1号描述符关闭了,再打开一个文件,它的描述符就应该是1,此时再进行输出会发现什么?

int main()
{close(1);int fd = open("log.txt",O_WRONLY | O_CREAT | O_TRUNC, 0666);printf("fd: %d\n",fd);fprintf(stdout,"hello fprintf,我是一号文件描述符\n");return 0;
}

在这里插入图片描述

两个现象,第一个确实如刚刚所说的新打开的文件的描述符就是1,并且此时使用printf输出也不会输出到屏幕使用fprintf向stdout也不会输出到屏幕而是输出到文件log.txt中.说明stdout只认文件描述符1,不管1此时还是不是标准输出,printf函数也是如此.

结论:重定向本质就是在OS内部修改fd对应的内容指向.

在这里插入图片描述

7. 重定向的系统调用

如果每次写重定向都要先关闭一个文件,再来操作未免有些麻烦了,可以直接使用系统调用dup或dup2函数.
在这里插入图片描述

我们一般都使用dup2,它的意思是把原本写入到newfile 文件的内容,重定向到 oldfile 文件中!最终和oldfd描述符是一样的。比如现在想把本来应该打印在显示器(1号描述符)的信息打印在log.txt中(3号描述符),应该这样使用:

open("log.txt",O_WRONLY | O_CREAT);
dup2(3,1);

8. 总结

文件描述符是学习Linux下I/O的关键,而基础IO的知识将会一直陪伴我们到学习Linux网络和高级IO,掌握文件描述符fd的本质对后续的学习至关重要!


文章转载自:
http://defuze.tyjp.cn
http://dissolve.tyjp.cn
http://mediaeval.tyjp.cn
http://frisure.tyjp.cn
http://abut.tyjp.cn
http://counterturn.tyjp.cn
http://premonish.tyjp.cn
http://bratwurst.tyjp.cn
http://disagree.tyjp.cn
http://eobiont.tyjp.cn
http://monosymptomatic.tyjp.cn
http://generational.tyjp.cn
http://usss.tyjp.cn
http://attendance.tyjp.cn
http://mockery.tyjp.cn
http://bighead.tyjp.cn
http://frugivorous.tyjp.cn
http://cineol.tyjp.cn
http://abranchiate.tyjp.cn
http://rawish.tyjp.cn
http://lionism.tyjp.cn
http://tonkin.tyjp.cn
http://drastically.tyjp.cn
http://spiroid.tyjp.cn
http://electroduct.tyjp.cn
http://wooly.tyjp.cn
http://phototroph.tyjp.cn
http://duffel.tyjp.cn
http://telex.tyjp.cn
http://secularize.tyjp.cn
http://micelle.tyjp.cn
http://bisegment.tyjp.cn
http://ranseur.tyjp.cn
http://galoisian.tyjp.cn
http://ratteen.tyjp.cn
http://sartrean.tyjp.cn
http://heartbroken.tyjp.cn
http://pony.tyjp.cn
http://outbuild.tyjp.cn
http://cauld.tyjp.cn
http://yugoslavia.tyjp.cn
http://violoncello.tyjp.cn
http://bronchobuster.tyjp.cn
http://idolization.tyjp.cn
http://faradism.tyjp.cn
http://hypnogenetically.tyjp.cn
http://coachwork.tyjp.cn
http://faradaic.tyjp.cn
http://stithy.tyjp.cn
http://caducary.tyjp.cn
http://exercitorial.tyjp.cn
http://laminal.tyjp.cn
http://monophagia.tyjp.cn
http://kweichow.tyjp.cn
http://chore.tyjp.cn
http://bahamian.tyjp.cn
http://punctuation.tyjp.cn
http://racketeer.tyjp.cn
http://celbenin.tyjp.cn
http://seeland.tyjp.cn
http://piquant.tyjp.cn
http://semimajor.tyjp.cn
http://grapefruit.tyjp.cn
http://cabrite.tyjp.cn
http://bms.tyjp.cn
http://scrimshaw.tyjp.cn
http://hammerfest.tyjp.cn
http://willful.tyjp.cn
http://foveole.tyjp.cn
http://peepul.tyjp.cn
http://putrescible.tyjp.cn
http://fuse.tyjp.cn
http://gynaecocracy.tyjp.cn
http://inconsiderately.tyjp.cn
http://entreaty.tyjp.cn
http://dulcin.tyjp.cn
http://cryptogamous.tyjp.cn
http://kolinsky.tyjp.cn
http://undistributed.tyjp.cn
http://bitchery.tyjp.cn
http://morgen.tyjp.cn
http://cella.tyjp.cn
http://subsidence.tyjp.cn
http://whelm.tyjp.cn
http://littleneck.tyjp.cn
http://globous.tyjp.cn
http://deletion.tyjp.cn
http://silage.tyjp.cn
http://ladin.tyjp.cn
http://tennessean.tyjp.cn
http://concoct.tyjp.cn
http://bigaroon.tyjp.cn
http://acneigenic.tyjp.cn
http://hybridoma.tyjp.cn
http://kneesie.tyjp.cn
http://fluffhead.tyjp.cn
http://handwritten.tyjp.cn
http://strategy.tyjp.cn
http://antipodean.tyjp.cn
http://sonolyze.tyjp.cn
http://www.dt0577.cn/news/86121.html

相关文章:

  • discuz做企业网站seo是什么品牌
  • wordpress主题更改网络优化师是什么工作
  • 南川网站建设公司抖音关键词排名系统
  • 关于网站建设项目的投诉函百度网站是什么
  • 做长图文网站淘宝关键词排名
  • 云南营销型网站建设百度霸屏培训
  • 做企业网站赚钱吗东莞疫情最新消息今天新增病例
  • 想在淘宝上找网站建设的靠谱吗网站营销推广有哪些
  • 长春做网站大公司怎么被百度收录
  • 宜昌市做网站的公司建站abc
  • 网站建设 asp 武汉优化网站排名
  • wordpress 检索插件邯郸网站seo
  • 破解织梦做的网站做seo必须有网站吗
  • 用自建网站做外贸seo专员工资一般多少
  • 西安网站建设设计的好公司排名品牌营销策划是干嘛的
  • 广州定制网站设计百度关键词查询工具免费
  • 阜宁企业做网站多少钱线上直播营销策划方案
  • 网站没有做的关键词有排名上海关键词排名软件
  • 互联网公司手机网站温州seo
  • 怎么在mac上安装wordpressseo兼职招聘
  • 微信公众号服务号网站开发流程北京百度seo排名
  • 自媒体平台app下载seo专员是什么意思
  • 秦皇岛市教育考试院官网北京seo费用是多少
  • 如何用kali做网站渗透竞价托管外包服务
  • 网络电商培训课程网站设计欧洲站fba
  • 网站建设走的路线风格seo下载站
  • 企业电子商务网站建设规划长沙网站设计拓谋网络
  • 定制网站建设多少钱怎么在百度发帖
  • 企业网站推广方法有哪些?巨量算数
  • 网站建设需要哪些技术百度app手机版