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

路由硬盘做网站空间不小程序开发小程序制作

路由硬盘做网站空间不,小程序开发小程序制作,seo外链是什么意思,濮阳建设企业网站公司系统角度的文件 在系统层面来说,文件就是内容加属性。 我们的所有文件操作其实就是对文件的内容和属性进行操作。 操作系统在任何进程运行时,都会打开三个输入输出流: 标准输入流,标准输出流以及标准错误流 对于C语言分别就是&am…

系统角度的文件

在系统层面来说,文件就是内容加属性
我们的所有文件操作其实就是对文件的内容和属性进行操作。
操作系统在任何进程运行时,都会打开三个输入输出流:
标准输入流,标准输出流以及标准错误流
对于C语言分别就是:stdin、stdout以及stderr。对于C++分别就是:cin、cout和cerr,自然其他语言也会有相似的概念,因为这是操作系统所支持的,而不是某个语言所独有的。

文件在没有被访问时,是存储在磁盘上的,访问时,在内存中,为什么不在磁盘直接访问呢,还要跑到内存里?

根据冯-诺依曼体系,cpu是访问不了磁盘的,所以,文件必须加载到内存当中,所以打开文件的本质就是:将文件加载到内存中

因为文件 = 内容 + 属性,所以加载时,加载的就是文件的内容或属性

三个默认打开流

Linux下一切皆文件,所以我们的键盘和显示器也是文件,我们朝着键盘输入数据,本质就是操作系统向键盘文件中读取数据;我们能看到显示器上的数据,本质就是操作系统向显示器文件写入数据。
在这里插入图片描述
标准输入流对应我们的键盘,标准输出流以及标准错误流对应我们的显示器。
我们整个fputs函数看一下:

#include <stdio.h>
int main()
{// 向显示器打印fputs("hello world!\n",stdout);fputs("hello world!\n",stdout);fputs("hello world!\n",stdout);return 0;
}

在这里插入图片描述

文件系统调用

open

在这里插入图片描述

pathname:从路径类型来看,他可以是绝对路径也可以是相对路径(响相当于当前的工作目录,比如file.txt)。
flags:打开文件的方式
mode:创建文件的默认权限(八进制数)

常用的几种打开方式:

参数选项含义
O_RDONLY以只读的方式打开文件
O_WRNOLY以只写的方式打开文件
O_APPEND以追加的方式打开文件
O_RDWR以读写的方式打开文件
O_CREAT当目标文件不存在时,创建文件

如果想同时兼具多个打开方式,可以使用逻辑与|链接。比如说我们想打开文件并且文件不存在时创建文件:

O_WRNOLY|O_CREAT

这些选项本质是一个宏,但是以前用几个宏我们就得传一个参数,怎么flags一个整型就搞定了呢?

flags采用的是位图表示法:32个比特位,理论上可以传递32个不同的标志位

下面的代码来演示一下标志位:

#include <stdio.h>
// 00001
#define ONE (1<<0)
// 00010
#define TWO (1<<1)
// 00100
#define TREE (1<<2)
// 01000
#define FOUR  (1<<3)
// 10000
#define FIVE (1<<4)
void Print(int flags)
{if(flags & ONE)printf("one\n");if(flags & TWO)printf("two\n");if(flags & TREE)printf("tree\n");if(flags & FOUR)printf("four\n");if(flags & FIVE)printf("five\n");}int main()
{printf("-------------------\n");Print(ONE);printf("-------------------\n");Print(TWO);printf("-------------------\n");Print(TREE);printf("-------------------\n");Print(FOUR);printf("-------------------\n");Print(FIVE);return 0;
}

在这里插入图片描述
我们需要注意的是:
如果我们打开的文件已经存在,就使用第一个接口:
int open(const char *pathname, int flags);
如果打开的文件不存在就需要使用第二个接口,为新创建的文件设置默认权限:
int open(const char *pathname, int flags, mode_t mode);

为什么新创建的文件需要mode呢?
因为创建文件权限和文件起始权限是两个独立的功能所以你要通过第三个参数mode指定权限

如果要设置文件默认权限,就需要考虑umask(掩码)的影响

文件起始权限的原理:
mode&(~mask),即mode参数与umask的反码按位与运算的结果。
比如mode为0666,umask设置为0022,实际文件权限就是0666 & ~0022 = 0644。

文件描述符

我们通过以下代码看看文件描述符:

#include<stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main()
{umask(0);//设置文件掩码为0int fd1 = open("log1.txt", O_RDONLY | O_CREAT, 0666);int fd2 = open("log2.txt", O_RDONLY | O_CREAT, 0666);int fd3 = open("log3.txt", O_RDONLY | O_CREAT, 0666);int fd4 = open("log4.txt", O_RDONLY | O_CREAT, 0666);int fd5 = open("log5.txt", O_RDONLY | O_CREAT, 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;
}

在这里插入图片描述
open的返回值为啥从3开始?

因为Linux进程默认情况下会有3个缺省打开的文件描述符,分别是标准输入0,标准输出1,标准错误2。fd_array[]的分配原则就是会去找最小的没有被使用的fd。
0,1,2对应的物理设备一般是:键盘,显示器,显示器

在我们的操作系统中,文件是由进程打开的,那么进程能够大量存在,由进程打开的文件肯定也是非常多的。为了方便对文件进行管理,我们会将每个文件struct file链接起来。

struct File
{// 属性// int mode// ……// struct File* next
};

一个文件可能被多个进程读写,操作系统为了能够精准识别每个进程对应的文件,我们的进程控制块task_struct就存在一个指向名为struct file_struct的结构体指针
这个结构体指针数组struct file*fd_array[]里面又存在每个名为struct file的地址,这样我们就能找到进程对应的文件了。
在这里插入图片描述
一般我们的指针数组truct file*fd_array[]的0,1,2下标分别对应我们的标准输入流,标准输出流,标准错误流三个文件,而这些下标就是我们所说的文件描述符——fd
跟上面的open的返回值为啥从3开始相呼应。
所以进程只需要找到对应的指针数组fd_array[],就能访问对应的文件,所以这就是为什么我们的文件系统调用接口一定得有fd
我们能把前三个标准流关闭试一试,看操作系统怎么分配fd:

#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
int main()
{close(0);close(2);int fd1 = open("log1.txt", O_RDONLY | O_CREAT, 0666);int fd2 = open("log2.txt", O_RDONLY | O_CREAT, 0666);int fd3 = open("log3.txt", O_RDONLY | O_CREAT, 0666);int fd4 = open("log4.txt", O_RDONLY | O_CREAT, 0666);int fd5 = open("log5.txt", O_RDONLY | O_CREAT, 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;
}

在这里插入图片描述
进程和文件的关联图:

当一个程序运行起来时,操作系统会将该程序的代码和数据加载到内存,然后为其创建对应的task_struct、mm_struct、页表等相关的数据结构,并通过页表建立虚拟内存和物理内存之间的映射关系。如果与我们的文件管理联系起来,就是一个磁盘文件log.txt加载进内存形成内存文件,最后加入对应双向链表中管理起来。

在这里插入图片描述
当文件存储在磁盘上时,我们称之为磁盘文件。而当磁盘文件被加载到内存中后,就变成了内存文件。磁盘文件与内存文件的关系,恰似程序和进程的关系。程序在运行起来后成为进程,同样,磁盘文件在加载到内存后成为内存文件
磁盘文件主要由两部分构成,即文件内容和文件属性。文件内容指的是文件中存储的数据,而文件属性则是文件的一些基本信息,包括文件名、文件大小以及文件创建时间等。这些文件属性也被称为元信息。在文件加载到内存的过程中,一般会先加载文件的属性信息。这是因为在很多情况下,我们可能只需要了解文件的基本属性,而不一定立即需要对文件内容进行操作。当确实需要对文件内容进行读取、输入或输出等操作时,才会延后式地加载文件数据。这样的设计可以提高系统的效率,避免在不必要的时候浪费资源加载大量的文件数据。


文章转载自:

http://usAV26Tm.Lpnpn.cn
http://5ShFLgrR.Lpnpn.cn
http://BycLHzvN.Lpnpn.cn
http://p0LPMJjO.Lpnpn.cn
http://DgVA5SsF.Lpnpn.cn
http://e43Mk5n2.Lpnpn.cn
http://9hvSo3YW.Lpnpn.cn
http://QP9x0WYH.Lpnpn.cn
http://zBndGJYl.Lpnpn.cn
http://AAHRRrxn.Lpnpn.cn
http://gcCaTuCG.Lpnpn.cn
http://EfrILQ8H.Lpnpn.cn
http://TQ7vt87Q.Lpnpn.cn
http://tTGl9FmQ.Lpnpn.cn
http://3d9A5JWF.Lpnpn.cn
http://oDtZH3zO.Lpnpn.cn
http://nz86eUTj.Lpnpn.cn
http://MdoW07fA.Lpnpn.cn
http://lwhAGvOT.Lpnpn.cn
http://Q3mS9dhq.Lpnpn.cn
http://sK7J3aRa.Lpnpn.cn
http://cJ784A3H.Lpnpn.cn
http://cCXoSJT0.Lpnpn.cn
http://x4QzIser.Lpnpn.cn
http://98OcBgFT.Lpnpn.cn
http://qwUiPggt.Lpnpn.cn
http://NVp1ls2R.Lpnpn.cn
http://igV7yZcd.Lpnpn.cn
http://A3fkjZx8.Lpnpn.cn
http://5U3s5Ipx.Lpnpn.cn
http://www.dtcms.com/wzjs/721610.html

相关文章:

  • 做公司的网站的需求有哪些内容网站的建设与维护需要资质吗
  • 做丝网网站哪个好汉语国际网站建设
  • 医学招聘网站开发区搜索引擎网站分析
  • 怎么做网站收款二维码wordpress付费阅读全文
  • 临沂建设中专官方网站潍坊网站关键字优化
  • 邢台网站制作报价多少钱服务器安全防护
  • 建立网站的目的是什么境外电商哪个平台好
  • 天津省网站制作厂家wordpress 收费主题
  • 做国际网站装修郑州个人网站建设
  • 深圳网站建站推广株洲网站优化
  • 网站建设情况说明书广告投放软件
  • 专业做网站推广的公司网络公关的作用
  • 云南 房地产网站建设国外游戏网站设计
  • 网站运营 解决方案网站建设适合什么单位
  • 网站开发地图做百科专用参考链接的网站
  • 网站改版需求网络网站如何推广
  • 网站关键词选取方法杭州开发网站
  • 厦门网站制作策划免费的网站程序
  • 五河网站建设哪家好软文模板app
  • 哪个网站做相片书好做家装的网站有什么区别
  • 网站建设应该注意的问题wordpress板块大小
  • 建设网站的效益分析房地产 东莞网站建设
  • 网站建设费可以一次性冲费用吗邯郸h5开发
  • 做网站公司教程php管理系统
  • 创办一个网站需要多少资金网站空间域名是什么
  • 网站设计技术有哪些?通辽市 做网站
  • 小说网站建设多少钱自己网站首页如何设置
  • 网站更新中网站安全狗服务名
  • 苏州住房和城乡建设局网站首页是否有可能一个人完成网站开发
  • 下载app软件安装手机上织梦网站建设后优化步骤