当前位置: 首页 > news >正文 网站建设包括哪方面营销宣传方案 news 2025/10/25 5:35:26 网站建设包括哪方面,营销宣传方案,网站建设常用的6大布局加代码,可以生成静态网站源码#x1f431;作者#xff1a;一只大喵咪1201 #x1f431;专栏#xff1a;《Linux学习》 #x1f525;格言#xff1a;你只管努力#xff0c;剩下的交给时间#xff01; 基础IO#x1f34e;文件操作#x1f349;使用C接口进行文件操作#x1f349;文件操作的系统调… 作者一只大喵咪1201 专栏《Linux学习》 格言你只管努力剩下的交给时间 基础IO文件操作使用C接口进行文件操作文件操作的系统调用文件描述符fd文件描述符fd0/1/2文件描述符fd的分配规则重定向重定向系统调用进程独立性Linux下一切皆文件总结在正式开始介绍之前本喵先重新谈论一下文件空文件也是要在内存中占据空间的因为它还有属性数据。文件 属性 内容文件操作 对内容 对属性 或者对内容和属性的操作。标定一个文件的时候必须使用路径 文件名因为文件具有唯一性。如果没有指名文件路径默认是对当前路径的文件进行访问。一个文件在没有被打开的时候是不能进行访问的。二进制可执行文件在没有运行的时候所谓的文件操作都是没有执行的。磁盘上的文件分为被打开的文件和没有被打开的文件。 结论文件操作的本质是进程和被打开文件之间的关系。 上面对文件的认识是我们所有使用Linux用户的共识。 文件操作 使用C接口进行文件操作 在将我们的程序编译完成以后再运行发现生成了一个新的文件并且文件中的内容和我们代码中写的一样。 这个过程中使用的是C语言的接口进行文件操作。以写的方式打开文件名问log.txt的文件没有的这个文件的话就会创建。使用C接口向该文件中写入内容。 本喵曾在文章C语言文件操作一文中详细介绍过C语言的文件操作接口有兴趣的小伙伴可以去看看。 不同的编程语言都有文件操作的接口包括CJavaPythonphp等等语言并且它们的操作接口函数都不一样但是它们所在的系统都是Linux系统。 无论上层语言如何变化但是进行文件操作的时候各种语言最终都会调用Linux的文件操作的系统调用接口。 文件操作的系统调用 open函数 可以看到函数声明有两个一个是两个参数的一个是三个参数的它们必然不是函数重载因为Linux是用纯C实现的。 参数解释 const char* pathname这是文件路径也就是我们要打开的文件所在的路径其中包括文件名如果没有路径只有文件名的话默认在当前路径打开。int flags打开方式选项标志位。在使用C语言进行文件操作的时候打开方式有“w”“r”“a”等方式系统调用open也有只是将这些标志放在了一个32位的变量中。 不同打开方式其对应的比特位就会被置1。然后将这个设置好的flags变量传给open系统调用就会按照相应的方式打开文件。mode_t mode它是权限值如果这个文件不存在那么以写的方式打开的时候就会创建这个文件在创建文件的时候需要给这个文件设定权限(使用八进制数)。如果这个文件存在的话那么就不用传第三个参数了因为文件的权限已经确定了。返回值是一个int类型的参数具体的在后面本喵会介绍但是如果打开失败就会返回-1。 如果有多个选项需要按位或在一起共同组成int flags变量传给open系统调用。 常用选项功能O_RDONLY只读O_WRONLY只写O_RDWR读写O_CREAT以写方式打开时如果文件不存在则创建文件O_TRUNC以写方式打开时清空文件中原内容再写O_APPEND追加方式打开文件 此时我们没有给open传第三个参数。 执行我们写的代码后log.txt文件是创建了但是它是红色的说明它有错误。可以看到它前面的权限是乱的因为我们没有指定创建文件时的权限。 将第三个参数加上因为创建的是普通文件所以就给它的默认权限是0666。 可以看到此时创建的文件就正常了但是权限并不是我们设定的0666而是0664这是因为有默认权限掩码(umask)的影响。 我们也可以使用系统调用在程序中改变umask的值。 将默认权限掩码改成0以后再创建的文件的权限就是我们设置的0666了。本喵曾在文章【Linux学习】权限详细讲解过权限相关的内容有兴趣的小伙伴可以去看看。 close函数 将打开文件时返回的int类型的fd值传给close系统调用后这个被打开的文件就被关闭了。关闭成功返回0如果关闭失败就返回-1。 write函数 参数解释 int fd打开文件时返回的int类型整数(文件描述符)。const void* buf要写入的数组地址。对于系统调用来说它并不在意写入的数据是什么类型的它接收到的数据都是二进制的数字然后按照字节为单位写入。size_t count要写入的字节个数。返回类型size_t写入多个自己就返回多少。 清空方式写入 可以看到成功将字符串写入到了log.txt文件中。 追加方式写入 使用追加方式打开文件再多次使用系统调用write写入。 可以看到在原有的基础上多了5行。 read函数 参数解释 int fd打开文件时返回的文件描述符。void* buf从文件中读取的数据放在这个数组中同样系统不管文件中的数据类型是什么都是按字节放入这个数组中。size_t count要读取的字节个数。ssize_t读取了多少个返回多少。 此时log.txt中有五行内容如上图绿色框中所示。 使用只读方式打开并且将读取的内容放在ch数组中。 编译执行之后成功打印出了log.txt中的内容。 接收文件中数据的数组我们设定的大小是1024个字节显然文件中的数据时没有这么大的。read系统调用的第三个参数传的也是1024但是肯定没有读取到1024个字节。每一个文件中都有一个文件结束符标志在C语言中我们见过也就是EOFread函数会自动判断文件是否结束所以即使设置读取的字节是1024个但是能够符合我们对读取要求将文件中的内容都读取出来。 以上便是我们常用的文件操作的系统调用。可以看到对文件进行什么样的操作取决于以什么样的方式打开文件再用相应的操作函数去操作文件。 继续和C语言对应 C语言的文件操作函数封装了对应的系统调用接口函数。所以说无论什么语言文件操作相关的函数都是对系统调用的封装。 文件描述符fd 在使用系统调用open时返回的那个整数就是文件描述符。 将文件名使用宏的方式打开多个文件。 现在我们见到了文件描述符发现它就是几个数字。 前面本喵已经讲过文件操作的本质就是进程和被打开文件的关系。系统中会存在大量被打开的文件而操作系统同样会管理这些被打开的文件。管理的方式和管理进程类似也是采用先描述再组织的方式。 当一个文件被打开后操作系统会创建一个对应的结构体对象类型是struct file。 struct file {//文件大小//文件类型......//文件的各种属性 }每打开一个文件操作系统就会创建这样的一个结构体对象将被打开的文件描述出来。将多个这样的结构体对象采用一定的方式组织起来比如链表的方式以方便操作系统管理这些被打开的文件。 在描述进程的结构体task_struct中有一个指针struct files_struct* files这个指针指向一个结构体对象该对象类型如下 struct files_struct {//......struct file* array[]; }struct files_struct结构体中存在一个指针数组array该数组中的指针指向的是一个个struct file类型的结构体对象。换言之该数组中放的是被打开文件结构体对象的地址。每一个被指向的struct file结构体对象都描述着一个被打开的文件。 在前面我们看到打印出来的fd值是连续的小整数这些小整数就是struct files_struct 结构体中指针数组struct file* array[]的下标。 文件描述符的本质就是数组的下标。 下面本喵通过一张示意图来展示一下 当一个程序被加载到内存中操作系统会创建一个结构体struct task_struct对象在该结构体中有一个指针struct files_struct* files指向一个struct files_struct结构体对象。这个结构体也被叫做进程描述符表该结构体中有一个数组struct file* array[]数组中存放的是被打开文件的结构体对象的地址。如上图中下标为3也就是fd的是3的时候访问到的是struct file* array[3]。通过数组中访问到的地址可以找到对应打开文件的结构体对象如上图中的struct file log.txt。 只有被打开的文件才会在内存中创建struct file结构体对象没有被打开的文件就静静的躺在磁盘上。 不是该进程打开的文件该进程执行的文件描述符表中也没有这个文件的地址。 文件描述符fd0/1/2 在上面打开多个文件的时候我们将打开文件的fd值打印出来发现它是从3开始的。 那么fd 0/1/2是什么呢 C默认会打开三个输入输出流分别是stdinstdoutstderr。 可以看到这三个流是FILE*类型的指针暂时不用管FILE是什么只需要知道它是一个结构体。 使用C语言的文件操作结构打开一个文件再使用系统调用去向文件中写内容。 成功的写入了。 系统调用write第一个参数需要传文件描述符fd。上面代码中传入的是FILE-_fileno并且成功运行。说明FILE中的_fileno就是文件描述符fd。 我们此时已经确定的知道了FILE结构体中是有文件描述符的。 在之前的代码中加上打印三个流的文件描述符的语句如上图中红色框所示。 文件描述符0 1 2出现了。 fd 0标准输入流(stdin)fd 1标准输出流(stdout)fd 2标准错误(stderr) 此时我们便清楚了为什么我们打开的文件文件描述符是从3开始的因为012被默认打开的三个流占据了。 每个进程的文件描述符表如上图所示。 文件描述符fd的分配规则 为什么我们打开的文件fd是从3开始的不是从5或者6开始的呢 我们将fd0的标准输入流关闭掉再打开文件并且打印fd值。 我们发现此时的fd成了0而不是3了。 同样的将fd2的流关闭在打开文件。 此时fd的值又成了2了。 根据这个现象可以得出结论文件描述符fd的分别规则是从小到大按顺序查找将没有被占用的数组下标作为被打开文件的文件描述符fd值。 重定向 前面我们只关闭过0和2没有关闭过1现在我们关闭一下1来看看。 将标准输出关闭然后打开文件并且打印出打开文件的文件描述符fd。 此时运行该程序后什么都没有显示。 因为将标准输出关闭了所以无法显示。 根据前面分析的文件描述符分配规则可以推断出将标准输出关闭以后再打开一个文件此时这个文件的文件描述符fd等于1。 在将fd1关闭后再打开一个文件从小到大按顺序查找发现数组下标为1的位置没有被占用所以新打开文件的fd就等于1。printf函数原本是要输出到标准输出的也就是fd为1的数组中指向的struct file对象的地址。此时下标为1的数组中不再是标准输出了而变成了我们新打开文件的地址。但是printf已经写死了它仍然会写入到fd为1的文件中所以原本打印在显示器上的内容此时会写入到新打开的文件中。 查看新打开的文件内容发现是原本应该打印在屏幕上的内容。 同样的将1关闭以后以追加的方式打开一个文件并且写入多行内容。 同样没有打印到屏幕上而是打印到了新打开的文件中。 这种将本应该输出到标准输出改为输出到其他文件中的行为称为重定向。 重定向的本质上上层语言使用的fd不变在内核中改变fd对应的struct file*地址。 重定向系统调用 上面重定向的实现总感觉怪怪的还需要关闭然后再打开新文件而且也不是很方便所以操作系统提供了一个系统调用可以直接实现重定向。 我们常用的函数是dup2。 参数解释 第一个参数是我们新打开文件的fd。第二个参数是标准输出到fd也就是1。 原本应该输出到显示器上的内容输出到了文件log.txt中。 我们上面一直演示的都是本应该输出到显示器重定向输出到了文件中这种从显示器到文件的重定向叫做输出重定向。 在shell中有命令可以直接实现输出重定向 ll命令原本是将文件包括属性显示到屏幕上的使用大于号输出重定向到了log.txt文件中如上图绿色框中所示。 使用只读方式打开文件log.txt该文件原本就存在。 文件中内容是如上图中红色框。将原本struct file* array[]数组中下标0的内容改成下标为fd的内容也就是dup2(fd,0)的作用。使用标准输入函数fgets从标准输入流也就是键盘中读取字符串。屏幕上打印读取到的内容。 运行时直接输出log.txt中的内容没有从键盘获取数据。也就是说fgets函数是从文件中获取到内容而不是标准输入。 这种从标准输入到文件的重定向叫做输入重定向。 shell中同样有输入重定向的命令是小于号具体本喵就不显示了。 使用追加方式打开文件并且采用输出重定向方式输出内容。 在原本文件内容都基础上追加内容。 这种以追加方式打开文件并且采用输出重定向的方式称为追加重定向。 shell中同样有追加重定向 使用双大于号实现了追加重定向在原本log.txt内容都基础上追加内容。 进程独立性 子进程重定向了以后会影响父进程吗根据进程独立性我们可以知道肯定是不会影响到。 在子进程中进行输出重定向父进程同样在标准输出打印。 子进程中的重定向并没有影响父进程标准输出的打印。 有两个进程一个父进程一个子进程操作系统维护着两个task_struct结构体如上图红色框所示。每个进程的PCB中都有一个struct files_struct*的指针files。它们各自指向的struct files_struct结构体中都有一个文件描述符表。两个文件描述符表中的内容在子进程刚创建时是一样的所以它们都指向相同的被打开的文件。当子进程将自己文件描述符表中下标为1的文件关闭以后并不影响父进程文件描述符表中下标为1的数组中的内容。 每个进程都会维护自己的文件描述符表所以多个进程就会存在多个文件描述符表但是这些表中的指针指向的被打开文件只有一套。 某个进程进行文件的打开与关闭操作时只需要修改自己的文件描述符表就可以不会对其他进程造成任何影响。 Linux下一切皆文件 Linux下一切皆文件这句话相信每一个学习Linux的人都听过那么如何理解呢 同样以文件操作的角度来看待硬件如下图所示 每一个硬件操作系统都会维护一个struct file类型的结构体硬件的各种信息都在这个结构体中并且还有对应读写函数指针(对硬件的操作主要就是读写)。每个硬件的具体读写函数的实现方式都在驱动层中使用到相应的硬件时操作系统会通过维护的结构体中的函数指针调用相应的读写函数。 站在操作系统的角度来看下层无论驱动层和硬件层中有什么在它看来都是struct file结构体都是通过维护这个结构体来控制各种硬件。站在操作系统的角度来看上层无论用户层以及系统调用有什么在它看来都是一个个进程都是一个个的task_struct结构体都是通过维护这个结构体来调度各个进程的。 真正的文件在操作系统中的体现也是结构体操作系统维护的同样是被打开文件的结构体而不是文件本身。 一切皆文件是指在操作系统中一切都是结构体。 总结 这篇文章主要讲解的是基础IO的应用包括文件操作的系统调用文件描述符fd的本质重定向以及如何理解Linux下一切皆文件。 文章转载自: http://www.morning.ssgqc.cn.gov.cn.ssgqc.cn http://www.morning.zxhpx.cn.gov.cn.zxhpx.cn http://www.morning.hwsgk.cn.gov.cn.hwsgk.cn http://www.morning.hsklc.cn.gov.cn.hsklc.cn http://www.morning.rkfh.cn.gov.cn.rkfh.cn http://www.morning.psyrz.cn.gov.cn.psyrz.cn http://www.morning.rlcqx.cn.gov.cn.rlcqx.cn http://www.morning.qjngk.cn.gov.cn.qjngk.cn http://www.morning.mnqz.cn.gov.cn.mnqz.cn http://www.morning.fbnsx.cn.gov.cn.fbnsx.cn http://www.morning.dycbp.cn.gov.cn.dycbp.cn http://www.morning.bkxnp.cn.gov.cn.bkxnp.cn http://www.morning.fyxtn.cn.gov.cn.fyxtn.cn http://www.morning.hhskr.cn.gov.cn.hhskr.cn http://www.morning.dmzfz.cn.gov.cn.dmzfz.cn http://www.morning.pwggd.cn.gov.cn.pwggd.cn http://www.morning.pftjj.cn.gov.cn.pftjj.cn http://www.morning.qwdqq.cn.gov.cn.qwdqq.cn http://www.morning.uqrphxm.cn.gov.cn.uqrphxm.cn http://www.morning.hlfgm.cn.gov.cn.hlfgm.cn http://www.morning.fmry.cn.gov.cn.fmry.cn http://www.morning.ccffs.cn.gov.cn.ccffs.cn http://www.morning.mnrqq.cn.gov.cn.mnrqq.cn http://www.morning.ksgjn.cn.gov.cn.ksgjn.cn http://www.morning.lgznf.cn.gov.cn.lgznf.cn http://www.morning.wgqtj.cn.gov.cn.wgqtj.cn http://www.morning.mgzjz.cn.gov.cn.mgzjz.cn http://www.morning.gmztd.cn.gov.cn.gmztd.cn http://www.morning.ykrkq.cn.gov.cn.ykrkq.cn http://www.morning.rcntx.cn.gov.cn.rcntx.cn http://www.morning.bpmtj.cn.gov.cn.bpmtj.cn http://www.morning.rdkgw.cn.gov.cn.rdkgw.cn http://www.morning.qwyms.cn.gov.cn.qwyms.cn http://www.morning.zcwzl.cn.gov.cn.zcwzl.cn http://www.morning.tyrlk.cn.gov.cn.tyrlk.cn http://www.morning.pudejun.com.gov.cn.pudejun.com http://www.morning.tfgkq.cn.gov.cn.tfgkq.cn http://www.morning.xqbbc.cn.gov.cn.xqbbc.cn http://www.morning.drcnn.cn.gov.cn.drcnn.cn http://www.morning.gycyt.cn.gov.cn.gycyt.cn http://www.morning.cwgpl.cn.gov.cn.cwgpl.cn http://www.morning.dzgmj.cn.gov.cn.dzgmj.cn http://www.morning.rhkgz.cn.gov.cn.rhkgz.cn http://www.morning.ljxps.cn.gov.cn.ljxps.cn http://www.morning.bdqpl.cn.gov.cn.bdqpl.cn http://www.morning.nxbkw.cn.gov.cn.nxbkw.cn http://www.morning.jpgfq.cn.gov.cn.jpgfq.cn http://www.morning.fqmbt.cn.gov.cn.fqmbt.cn http://www.morning.dskzr.cn.gov.cn.dskzr.cn http://www.morning.ldcrh.cn.gov.cn.ldcrh.cn http://www.morning.tkgjl.cn.gov.cn.tkgjl.cn http://www.morning.tnhqr.cn.gov.cn.tnhqr.cn http://www.morning.bnpn.cn.gov.cn.bnpn.cn http://www.morning.pyncx.cn.gov.cn.pyncx.cn http://www.morning.mlwpr.cn.gov.cn.mlwpr.cn http://www.morning.wqwbj.cn.gov.cn.wqwbj.cn http://www.morning.rmqmc.cn.gov.cn.rmqmc.cn http://www.morning.crfjj.cn.gov.cn.crfjj.cn http://www.morning.zstbc.cn.gov.cn.zstbc.cn http://www.morning.kzcfr.cn.gov.cn.kzcfr.cn http://www.morning.kgcss.cn.gov.cn.kgcss.cn http://www.morning.rnpnn.cn.gov.cn.rnpnn.cn http://www.morning.bqyb.cn.gov.cn.bqyb.cn http://www.morning.juju8.cn.gov.cn.juju8.cn http://www.morning.qjtbt.cn.gov.cn.qjtbt.cn http://www.morning.pxlql.cn.gov.cn.pxlql.cn http://www.morning.xgjhy.cn.gov.cn.xgjhy.cn http://www.morning.lxctl.cn.gov.cn.lxctl.cn http://www.morning.dkfrd.cn.gov.cn.dkfrd.cn http://www.morning.cltrx.cn.gov.cn.cltrx.cn http://www.morning.etsaf.com.gov.cn.etsaf.com http://www.morning.ktmbr.cn.gov.cn.ktmbr.cn http://www.morning.mlnzx.cn.gov.cn.mlnzx.cn http://www.morning.hxbjt.cn.gov.cn.hxbjt.cn http://www.morning.bnlkc.cn.gov.cn.bnlkc.cn http://www.morning.yxzfl.cn.gov.cn.yxzfl.cn http://www.morning.jzxqj.cn.gov.cn.jzxqj.cn http://www.morning.lmnbp.cn.gov.cn.lmnbp.cn http://www.morning.hsjfs.cn.gov.cn.hsjfs.cn http://www.morning.wpqwk.cn.gov.cn.wpqwk.cn 查看全文 http://www.tj-hxxt.cn/news/247347.html 相关文章: 专业做网站建设公长沙做网站工作室 企业局域网视频网站建设网络电商推广方案 手机版网站版面设计怎么做个人住房公积金贷款 视频网站建设技术方案书WordPress如何更改文章链接 在深圳怎么进大公司网站有哪些可以在网上做兼职的网站 现在.net做网站的多吗推荐郑州网站建设公司 建设招聘网站需要哪些资质app 外包开发公司 网站的功能建设wordpress改全屏 陕西示范校建设专题网站建设 云服务器 网站 公司展示网站模板免费下载网页设计策划 网站发布到ftpwordpress网站打不开 深圳返利网站建设阳江问政平台官网入口 怎么给网站加代码企业网站的基本内容有哪些 镇江手机网站建设wordpress支付宝_财付通_paypal集成插件 北京上地做网站电子商务网站后台核心管理 企业站seo价格郑志平爱站网创始人 怎样维护公司网站大型门户网站建设方案 东阳便宜营销型网站建设国家重点学科建设网站 两个公司的网站建设广东广州网站建设 长春网站建设公司排名360建筑网官方网站 个性化网站建设定制诸城网络科技网站建设 湖南网站服务301 wordpress 仿珠宝首饰网站开发购物网站开发教学视频 比较正规的招聘网站宝安网站设计流程 c语言做网站账号登录系统wordpress 列表文章更新 浙江省建设会计协会网站西安做网站优化公司报价 网站做导航的地图导航七零三八零四温州论坛 长春网站建设中心网站建设外包给别人要注意什么 企业网站建设项目描述网站前台管理系统 网站的分享按键智慧团建密码只能是8位吗