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

给一个公司做网站需要多久运营商推广5g技术

给一个公司做网站需要多久,运营商推广5g技术,网站建设中 下载,房子设计图平面图前面介绍了与文件相关的各种操作&#xff0c;其中的各个接口都离不开一个整数&#xff0c;那就是文件描述符&#xff0c;本文将介绍文件描述符的一些相关知识。 目录 <1>现象 <2>原理 文件fd的分配规则和利用规则实现重定向 <1>现象 我们可以先通过prin…

前面介绍了与文件相关的各种操作,其中的各个接口都离不开一个整数,那就是文件描述符,本文将介绍文件描述符的一些相关知识。

目录

<1>现象

<2>原理

文件fd的分配规则和利用规则实现重定向


<1>现象

我们可以先通过printf把文件描述符打印出来,我们可以多打开几个文件,看看文件描述符有什么特别,再解释原理

#include<stdio.h>
#include<unistd.h>
#include<string.h>
#include<fcntl.h>
#include<sys/stat.h>
#include<sys/types.h>#define filename "file.txt"
int main()
{int fd1 = open("log1.txt",O_WRONLY|O_CREAT|O_TRUNC,0666);int fd2 = open("log2.txt",O_WRONLY|O_CREAT|O_TRUNC,0666);int fd3 = open("log3.txt",O_WRONLY|O_CREAT|O_TRUNC,0666);int fd4 = open("log4.txt",O_WRONLY|O_CREAT|O_TRUNC,0666);int fd5 = open("log5.txt",O_WRONLY|O_CREAT|O_TRUNC,0666);printf("fd1:%d\n",fd1);printf("fd2:%d\n",fd2);printf("fd3:%d\n",fd3);printf("fd4:%d\n",fd4);printf("fd5:%d\n",fd5);return 0;
}

运行结果

可以看见,文件的描述符从3开始增加,在3之前的0 1 2 其实已经被用掉了。看到这些数字,其实我们可以联想到数组的下标(因为文件描述符不能小于0),那么我们就可以假设一个文件描述符就代表该文件在某一数组中的位置(至于这个数组是什么,后面详谈),那是谁用了0 1 2 呢?其实是标准输入、输出和错误三个文件。

<2>原理

前面介绍过文件的几种系统调用的接口,我们不难发现,这些接口其实和C语言库中的文件操作函数非常相似,实际上C语言的文件操作函数就是封装系统调用接口。既然C语言底层是系统调用接口,那我们在使用C语言的文件函数,这些系统调用接口所需要文件描述符在哪里呢? 当然是在FILE 这个结构体当中,这个结构体是C标准库自己封装的一个结构体。 

既然FILE这个结构体中含有文件描述符,那我们就可以通FILE来查看标准输入、输出和错误的文件的文件描述符是多少。下面演示一下代码

#include<stdio.h>
#include<unistd.h>
#include<string.h>
#include<fcntl.h>
#include<sys/stat.h>
#include<sys/types.h>#define filename "file.txt"
int main()
{printf("%d\n",stdin->_fileno); // _fileno是FILE结构体中文件描述符的成员名printf("%d\n",stdout->_fileno);printf("%d\n",stderr->_fileno);
}

运行结果

  这就印证了0 1 2 这三个文件描述符是一开始就被标准输入、输出和错误占用了。

文件描述符的具体含义

前面说过,打开文件的进程,所以研究文件的各种操作,就是研究进程与磁盘数据的关系。而我们在日常运行进程时,我们可能要打开很多的文件,对于这些文件,系统自然是需要管理的。而在linux中,OS就通过创建了一个file的结构体(别的系统也有可能是其他的数据结构)来描述一个被打开的文件,file这个结构体中包含了很多内容,这里比较重要的是文件属性、方法集和缓冲区。而这些文件的file又可以通过指针链接起来。进程PCB中有一个结构体指针,该结构体指针指向的结构体是用于描述该进程打开的所有文件,它也称为文件描述表,其中就包含了每个文件的file指针。

所以当我们需要打开一个新文件时,先在磁盘中找到对应的位置,然后生成新的struct file,初始化struct file中的数据,并将其指针填入struct file* fd_array[] 中,最后再将对应fd_array的下标返回给上层,我们就可以使用返回的fd进行文件操作。而我们如果要关闭文件时,就释放对应的struct file。

题外话

在linux中我们把所有的东西都看成文件,底层的硬件设施也可以看成文件。对于这些硬件肯定有读方法和写方法,这些硬件的读写方式肯定是不一样的。但我们可以用一个struct file来描述这些读写方法,并将这些不同的读写方法重名成相同的函数名,这样我们在调用硬件的一些函数时,就可以忽略底层的差异,直接使用上层的接口

文件fd的分配规则和利用规则实现重定向

直接先说规则:最小的没有被使用的数组下标,会分配给最新打开的文件。我们用一段代码演示一下上述的规则。

从运行结果上来看,我们关闭了文件描述符为0的文件,然后重新创建了一个log1.txt文件(该文件之前不存在)。这个新建文件的文件描述符为零,不是3,说明上述的分配规则是正确的。

输出重定向

我们先用一段代码实现一下输出重定向,再解释一下原理

#include<stdio.h>
#include<unistd.h>
#include<string.h>
#include<fcntl.h>
#include<sys/stat.h>
#include<sys/types.h>#define filename "file.txt"
int main()
{close(1);int fd = open("log1.txt",O_WRONLY|O_CREAT|O_TRUNC,0666);printf("fd:%d\n",fd);return 0;
}

运行结果

这里我们可以发现,运行代码时,显示器上并没有显示出对应的文件描述符。而log1.txt文件里面出现了对应的文件描述符。这就是我们所熟悉的输出重定向,因为printf这个函数底层只认fileno (文件描述符在struct file里面的成员名)。而这里我们把标准输出文件关闭了,给打开的log1.txt分配的文件描述符就是1,printf只会朝文件描述符为1的文件里面打印。所以才会出现上述现象。以此类推,我们也可以写出输入重定向,下面演示一下

先创建一个long.txt文件,向里面写入一些内容(这里为了方便演示,我只输入了一段数字),然后关闭stdin(也就是标准输入),然后系统给long.txt分配文件描述符为0,使用scanf读取数据,而scanf只认文件描述符为0的文件,所以scanf会从long.txt中读取数据。

#include<stdio.h>
#include<unistd.h>
#include<string.h>
#include<fcntl.h>
#include<sys/stat.h>
#include<sys/types.h>#define filename "file.txt"
int main()
{close(0);int fd = open("long.txt",O_RDONLY);int a = 0;scanf("%d",&a);printf("%d\n",a);return 0;
}

运行结果

同理,如果我们需要实现追加重定向,我们只需要在原来输出重定向的基础上,把打开文件的方式中的O_TRUNC修改成O_APPEND即可,其余的均不变。、

dup2函数

像上述实现重定向的方式颇为繁琐,有没有更好的方式呢?当然是有的。这里文件描述符代表的数组里面存的是struct file的指针,如果我们要实现重定向,只要将数组对应下标的内容进行交换即可。而这里由于stdout可以不被使用,所以我们可以把新打开文件对应的指针,直接拷到stdout对应的数组下标中即可。

这里有专门的系统调用来帮我们实现这一功能,这个接口就是dup2(另外两个暂时不学)。

这个函数会把对应数组下标的内容拷贝到另外一个数组下标的对应内容上,而在这里就是把oldfd对应的数组下标内容拷贝到newfd对应数组下标的内容里面,所以最后只剩下oldfd对应数组下标内容。

如果要实现重定向操作,我们就不需要再关闭文件描述符,只需要使用dup2这个接口即可。

以上就是全部内容,如果文中有不对之处,还望各位大佬指正,谢谢!!!

http://www.ds6.com.cn/news/8135.html

相关文章:

  • 如何看网站的关键词网站流量查询工具
  • 购物分享网站怎么做的今天的新闻内容
  • 制作一个网站平台网络新闻发布平台
  • 云南政务网站建设电商网站开发平台有哪些
  • 舟山网站建设公众号推广方案
  • 百度站长平台网站提交三只松鼠网络营销策划书
  • 4k视频素材网站湖南百度推广
  • 南沙移动网站建设盘多多百度网盘搜索引擎
  • 有没有专门做二手车网站seo培训一对一
  • 园林景观设计网站推荐2024新闻热点摘抄
  • 网站建设的维护工作网站页面分析
  • 主题在wordpress泾县网站seo优化排名
  • 景区网站的建设公司怎么注册网站平台
  • 怎么做ppt教程网站在百度做广告多少钱
  • 做百科需要发哪些网站安康地seo
  • 做塑料的网站有哪些免费seo诊断
  • 云服务器防御太原seo软件
  • 优化型网站建设哪里可以学企业管理培训
  • 网站域名的安全性软文批发网
  • 广告公司经营范围怎么写最好十堰seo优化
  • 开创云网站建设搜索引擎优化的作用是什么
  • 软件合集大全站长工具的使用seo综合查询排名
  • dw做的网站怎么发布友情链接是什么意思
  • 技术好的手机网站建设如何做网站seo
  • 重庆网站设计开发培训微信小程序
  • 怎么做58同城网站线上广告宣传方式有哪些
  • 九龙坡网站建设多少钱seo高级
  • 网站原则百度关键词排名怎么靠前
  • 请人做网站需要什么推广搜索怎么选关键词
  • 做家具有那个网站好网址服务器查询