Linux的学习之路:15、文件(2)

news2024/11/18 9:03:59

摘要

这里就说一下文件描述符和重定向以及缓冲区

目录

摘要

一、文件描述符

1、0 、1、2

2、分配规则

二、重定向

三、缓冲区

四、代码


一、文件描述符

1、0 、1、2

文件描述符(File Descriptor,简称 fd)是计算机科学中的一个术语,尤其是在 Unix、Linux 及其类似操作系统中。它是一个用于表述指向文件的引用的抽象化概念。

文件描述符是一个非负整数(通常是小整数),用于内核中唯一标识一个打开的文件、设备、套接字或其他 I/O 资源。当程序打开一个文件(或任何其他 I/O 资源)时,内核向进程返回一个文件描述符。文件描述符用于在后续系统调用中识别该文件或其他 I/O 资源。

Linux进程默认情况下会有3个缺省打开的文件描述符,分别是标准输入0, 标准输出1, 标准错误2,0、1、2对应的物理设备一般是:键盘,显示器,显示器,昂感觉说的好抽象,下面将用代码来演示一下 ,如下方代码就是利用0进行输入一个字符串然后进行输出到显示器上,上面就是利用0,1,2进行使用了。

现在知道,文件描述符就是从0开始的小整数。当我们打开文件时,操作系统在内存中要创建相应的数据结构来描述目标文件。于是就有了file结构体。表示一个已经打开的文件对象。而进程执行open系统调用,所以必须让进程和文件关联起来。每个进程都有一个指针*files, 指向一张表files_struct,该表最重要的部分就是包涵一个指针数组,每个元素都是一个指向打开文件的指针!所以,本质上,文件描述符就是该数组的下标。所以,只要拿着文件描述符,就可以找到对应的文件

#include <stdio.h>
    2 #include <sys/types.h>
    3 #include <sys/stat.h>
    4 #include <fcntl.h>
    5 #include <string.h>
    6 
    7 int main()
    8 {
    9     char buf[1024];
   10     ssize_t s=read(0,buf,sizeof(buf));
   11     if(s>0)
   12     {
   13         buf[s]=0;                                                                                                                                                                                                                    
   14         write(1,buf,strlen(buf));
   15         write(2,buf,strlen(buf));
   16     }
   17     return 0;
   18 }
   19 

2、分配规则

这里直接利用代码进行演示,首先是第一段,fd输出是3。

int main()
    8 {
    9     int fd = open("myfile", O_RDONLY);
   10     if(fd < 0)
   11     {
   12         perror("open");
   13         return 1;
   14     }                                                                                                                                                                                                       
   15     printf("fd: %d\n", fd);
   16     close(fd);
   17     return 0;
   18 }
   19 

在看下面这段代码,输出了0和2,就可以得出文件描述符的分配规则:在files_struct数组当中,找到当前没有被使用的最小的一个下标,作为新的文件描述符,这样,每次当程序打开一个现有文件或创建一个新文件时,内核都会向进程返回一个这样的文件描述符。

文件描述符在形式上是一个非负整数,它实际上是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。这个文件描述符就是内核为了高效管理已被打开的文件所创建的索引,用来指向被打开的文件。在程序设计中,一些涉及底层的程序编写往往会围绕着文件描述符展开。所有执行I/O操作的系统调用都会通过文件描述符进行。

 int main()
    8 {
    9     //close(0);
    10     close(2);                                                                                                                                                                                               
   11     int fd = open("myfile", O_RDONLY);          
   12     if(fd < 0)                                  
   13     {                                           
   14         perror("open");                         
   15         return 1;                               
   16     }                                           
   17     printf("fd: %d\n", fd);                     
   18     close(fd);                                  
   19     return 0;                                   
   20 }                                               
   21       

 

所以由此可得就可以看出文件描述符就是一个小整数。

二、重定向

如果关闭1呢,那么输出的可以放在哪?所以看一下下方代码,此时,我们发现,本来应该输出到显示器上的内容,输出到了文件 myfile 当中,其中,fd=1。这种现象叫做输出重定向。常见的重定向有:>,>>,<

int main()
   24 {
   25     close(1);
   26     int fd = open("myfile", O_WRONLY|O_CREAT, 00644);
   27     if(fd < 0)
   28     {    
   29         perror("open");                                                              
   30         return 1;                                 
   31     }                                 
   32     printf("fd: %d\n", fd);
   33     fflush(stdout);                         
   34     close(fd);                     
   35     exit(0);         
   36 }            

三、缓冲区

一般而言,缓冲行的设备文件--显示器,全缓冲的设备文件--磁盘文件,所有的设备永远都是倾向于全缓冲,如果缓冲区满了,才进行刷新,和设备IO的时候,数据量的大小不是主要矛盾,你和外设预备IO的过程是最消耗世间的。

所以想要提高效率,只有更少次的IO操作,也就是更少此的外设的访问,这样才能提高效率,也就之前说过的冯诺依曼。

如果向显示器打印,刷新策略是行刷新,那么最后执行fork的时候,一定是函数执行完了并且数据已经被刷新了。

如果需要应对的程序进行了重定向,也就是向磁盘文件打印,隐形的刷新策略变成了全缓冲,\n就没有意义了,fork的时候一定要函数执行完了,但是数据还没刷新

四、代码

1 #include <stdio.h>
    2 #include <sys/types.h>
    3 #include <sys/stat.h>
    4 #include <fcntl.h>
    5 #include <string.h>
    6 
    7 //int main()
    8 //{
    9 //    //close(0);
   10 //    close(2);
   11 //    int fd = open("myfile", O_RDONLY);
   12 //    if(fd < 0)
   13 //    {
   14 //        perror("open");
   15 //        return 1;
   16 //    }
   17 //    printf("fd: %d\n", fd);
   18 //    close(fd);
   19 //    return 0;
   20 //}
   21 //
   22 
   23 int main()
   24 {
25     close(1);
   26     int fd = open("myfile", O_WRONLY|O_CREAT, 00644);
   27     if(fd < 0)
   28     {
   29         perror("open");
   30         return 1;
   31     }
   32     printf("fd: %d\n", fd);
   33     fflush(stdout);
 34     close(fd);
35     exit(0);
   36 }


 //int main()
   76 //{
   77 //    char buf[1024];
   78 //    ssize_t s=read(0,buf,sizeof(buf));
   79 //    if(s>0)
   80 //    {
   81 //        buf[s]=0;
   82 //        write(1,buf,strlen(buf));
   83 //        write(2,buf,strlen(buf));
   84 //    }
   85 //    return 0;
   86 //}
   87 //

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1610438.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OpenHarmony实战开发-如何利用panel实现底部面板内嵌套列表。

介绍 本示例主要介绍了利用panel实现底部面板内嵌套列表&#xff0c;分阶段滑动效果场景。 效果图预览 使用说明 点击底部“展开”&#xff0c;弹出panel面板。在panel半展开时&#xff0c;手指向上滑动panel高度充满页面&#xff0c;手指向下滑动panel隐藏。在panel完全展开…

IO——进程间通讯 IPC

1. 进程间通信方式 (1) 早期进程间通信&#xff1a; 无名管道(pipe)、有名管道(fifo)、信号(signal) (2) system V IPC&#xff1a; 共享内存(shared memory)、消息队列(message queue)、信号灯集(semaphore set) (3) BSD&#xff1a; 套接字(socket) 2. 无名管道 2.1特点 …

局域网管理软件,适合在局域网内的管理软件有哪些?

信息技术的不断发展&#xff0c;局域网在企业、学校等机构中得到了广泛应用。 局域网不仅能够提高数据传输效率&#xff0c;还能实现资源共享和协同工作。 为了更好地管理和维护局域网&#xff0c;需要使用一些专业的局域网管理软件。 一、局域网的应用范围 局域网&#xff…

ruoyi element-ui 实现拖拉调整图片顺序

ruoyi element-ui 实现拖拉调整图片顺序 安装sortablejs https://sortablejs.com/npm 安装sortablejs npm install sortablejs --save相关options var sortable new Sortable(el, {group: "name", // or { name: "...", pull: [true, false, clone, …

华为 2024 届实习招聘——硬件-电源机试题(四套)

华为 2024 届实习招聘——硬件-电源机试题&#xff08;四套&#xff09; 部分题目分享&#xff0c;完整版带答案(有答案&#xff0c;答案非官方&#xff0c;未仔细校正&#xff0c;仅供参考&#xff09;&#xff08;共四套&#xff09; 获取&#xff08;WX:didadidadidida313&…

优思学院|ISO45001职业健康安全管理体系是什么?

ISO45001:2018是新公布的国际标准规范&#xff0c;全球备受期待的职业健康与安全国际标准&#xff08;OH&S&#xff09;于2018年公布&#xff0c;并将在全球范围内改变工作场所实践。ISO45001将取代OHSAS18001&#xff0c;成为全球工作场所健康与安全的参考。 ISO45001:201…

完整、免费的把pdf转word文档

在线工具网 https://www.orcc.online/pdf 支持pdf转word&#xff0c;免费、完整、快捷 登录网站 https://orcc.online/pdf 选择需要转换的pdf文件&#xff1a; 等待转换完成 点击蓝色文件即可下载 无限制&#xff0c;完整转换。

LLM推理加速,如何解决资源限制与效率挑战

©作者|Zane 来源|神州问学 LLM加速推理&#xff0c;GPU资源破局之道。 引言 大型语言模型&#xff08;LLM&#xff09;已经在多种领域得到应用&#xff0c;其重要性不言而喻。然而&#xff0c;随着这些模型变得越来越普遍&#xff0c;对GPU资源的需求也随之激增&#xff…

问卷回收率太低?用这几个小技巧轻松提升!

在进行调查研究时&#xff0c;高回收率是保障数据质量和调研成果有效性的关键因素之一。然而&#xff0c;有时候我们面对的情况是调查问卷的回收率较低&#xff0c;这可能会影响到数据的客观性和准确性。在这种情况下&#xff0c;我们需要采取措施来提高调查问卷的回收率&#…

MapReduce 机理

1.hadoop 平台进程 Namenode进程: 管理者文件系统的Namespace。它维护着文件系统树(filesystem tree)以及文件树中所有的文件和文件夹的元数据(metadata)。管理这些信息的文件有两个&#xff0c;分别是Namespace 镜像文件(Namespace image)和操作日志文件(edit log)&#xff…

Python --- 在python中安装NumPy,SciPy,Matplotlib以及scikit-learn(Windows平台)

在python中安装NumPy&#xff0c;SciPy&#xff0c;Matplotlib以及scikit-learn(Windows平台) 本文是针对(像我一样的)python新用户所写的&#xff0c;刚刚在电脑上装好python之后&#xff0c;所需的一些常见/常用的python第三方库/软件包的快速安装指引。包括了这些常用安装包…

0-1背包问题:贪心算法与动态规划的比较

0-1背包问题&#xff1a;贪心算法与动态规划的比较 1. 问题描述2. 贪心算法2.1 贪心策略2.2 伪代码 3. 动态规划3.1 动态规划策略3.2 伪代码 4. C语言实现5. 算法分析6. 结论7. 参考文献 1. 问题描述 0-1背包问题是组合优化中的一个经典问题。假设有一个小偷在抢劫时发现了n个…

C语言--函数递归

目录 1、什么是递归&#xff1f; 1.1 递归的思想 1.2 递归的限制条件 2. 递归举例 2.1 举例1&#xff1a;求n的阶乘 2.2 举例2&#xff1a;顺序打印⼀个整数的每⼀位 3. 递归与迭代 扩展学习&#xff1a; 早上好&#xff0c;下午好&#xff0c;晚上好 1、什么是递归&…

【Web】DASCTF X CBCTF 2022九月挑战赛 题解

目录 dino3d Text Reverser cbshop zzz_again dino3d 进来是一个js小游戏 先随便玩一下&#xff0c;显示要玩够1000000分 直接console改分数会被检测 先是JSFinder扫一下&#xff0c;扫出了check.php 到js里关键词索引搜索check.php 搜索sn&#xff0c;发现传入的参数是…

上古掌控安全的神-零:Spring Security5.x到Spring Security6.x的迁移

1. 本文概述 之前有写过一篇关于Spring Security的文章&#xff0c;但那已经是相对比较旧的版本了&#xff0c;就目前Spring Security6.0来说&#xff0c;这其中出现了不少的变动和更新&#xff0c;很多API的使用也是有不小的变化&#xff0c;所以我觉得有必要再写几篇文章学习…

OpenCV4.10使用形态运算提取水平线和垂直线

返回:OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;OpenCV的查找命中或未命中 下一篇&#xff1a;OpenCV4.9图像金字塔-CSDN博客 目标 在本教程中&#xff0c;您将学习如何&#xff1a; 应用两个非常常见的形态运算符&#xff08;即膨胀和…

java/C#语言开发的医疗信息系统10套源码

java/C#语言开发的医疗信息系统10套源码 云HIS系统源码&#xff0c;云LIS系统源码&#xff0c;PEIS体检系统&#xff0c;手麻系统 源 码&#xff0c;PACS系统源码&#xff0c;微源预约挂号源码&#xff0c;医院绩效考核源码&#xff0c;3D智能导诊系统源码&#xff0c;ADR药物…

数据分析场景,连号相关业务

连号相关业务 业务场景&#xff1a;现在需要从a列一堆编号中&#xff0c;将连号范围在10以内的数据分别分成一组。 先看实先效果 演示的为db2数据库&#xff0c;需要含有窗口函数&#xff0c;或者可以获取到当前数据偏移的上一位数据 第一步&#xff1a;将A列数据正序第二步…

【笔试强训_Day06】

文章目录 1.字符串相乘 1.字符串相乘 题目链接 解题思路&#xff1a; 高精度乘法&#xff0c;注意要学会下面这种列式相乘的形式&#x1f34e; 注意细节❗&#xff1a; ① &#x1f34e; 首先把列式相乘的数据都存放到数组中去&#xff0c; 然后再对数组中的数据进行取余进…

Web开发:ASP.NET CORE的前端demo(纯前端)

目录 一、建立项目 二、删除无用文件 三、样式添加 四、写一个登录页面 五、登录主界面 一、建立项目 二、删除无用文件 三、样式添加 将你的图片资源添加在wwwroot下方&#xff0c;例如pics/logo.png 四、写一个登录页面 将Privacy.cshtml改为 Forget.cshtml &#xff0…