Linux编程 1.3 系统文件IO- 内核表示

文件IO内核表示

1、内核中的三种数据结构

1.1文件描述符表

文件描述符标志
文件表项指针

1.2 文件表项

文件状态标志
读、写、追加、同步和非阻塞等状态标志
当前文件偏移量
i节点表项指针
引用计数器

1.3 节点

文件类型和对该文件的操作函数指针
当前文件长度
文件所有者
文件所在的设备、文件访问权限
指向文件数据在磁盘块上的所在位置的指针等。

在这里插入图片描述

2、dup和dup2函数

#include<unistd.h>
int dup(int oldfd);
int dup2(int oldfd,int newfd);
返回:成功返回新文件描述符,出错返回-1
功能:文件描述符的复制
  • 参数
    • oldfd:原先的文件描述符
    • newfd:新的文件描述符
  • 由dup返回的新文件描述符一定是当前可用文件描述符中的最小数值。
  • 用dup2则可以用newfd参数指定新描述符的数值。如果newfd已经打开,则先将其关闭。如若oldfd等于newfd,则dup2返回newfd,而不关闭它。
  • 在进程间通信时可用来改变进程的标准输入和标准输出设备。
  • 示例:
int main(int argc,char* argv[])
{
	int i=1;
	for(;i<argc;i++)
	{
		if(!strcmp(argc[i],"+"))
		{
			if(fd=open(argv[++i],O_RDOULY)<0)
			{
				sys_err("open");
			}
			else
			{
				if(dup2(fd,STDIN_FILENO)!=STDIN_FILENO)
				{
					sys_err("dup2");
				}
				close(fd);
			}
		}
		else if(!strcmp(argv[i],"-"))
		{
			int fd=open(argv[++i],O_WRONLY|O_TRUNC,077);
			if(fd<0)
			{
				sys_err("open");
			}
			else
			{
				if(dup2(fd,STDIN_FILENO)=STDIN_FILENO)
				{
					sys_err("dup2");
				}
				close(fd);
			}
		}
		else
		{
			fprintf(stderr,"usere:%s[+]file2[-]file2\n",argv[0]);
			exit(1);
		}
		copy(STDIN_FILENO,STDIN_FILENO);
		return 0;
	}
}

3、fcntl函数

#include<unistd.h>
#include<fcntl.h>
int fcntl(int fd,int cmd);
int fcntl(int fd,int cmd,long arg);
int fcntl(int fd,int cmd,struct flock * lock);
返回:成功则依赖于cmd,出错返回-1
功能:可以改变已经打开文件的性质

3.1常见的功能

  • 复制一个现存的描述符,新文件描述符作为函数值返(cmd=F_DUPFD

  • 获得/设置文件描述符标志(cmd=F_GETFD或F_SETFD

  • 获得/设置文件状态标志(cmd=F_GETFL 或F_SETFL

  • 获得/设置文件锁(cmd=F_SETLK、F_SETFD、F_SETLKW)

    • 第三个参数为struct flock结构体

3.2 cmd的常见取值

F_DUPFD: 复制文件描述符,新的文件新的文件描述符作为函数返回值返回。
F_GETFD/F_SETFD : 获取/设置文件描述符,通过第三个参数设置
F_GETFL/F_SETFL :
①获取/设置文件状态标志,通过第三个参数设置
②可以更改的几个标志是:O_APPEND,O_NONBLOCK,SYNC,O_ASYNC (O_RDONYL、O_WRONLY和O_RDWR不适用)
示例:

// 1 增加文件状态
//获取原来的文件状态标志
int val=fcntl(fd,F_GETFL);
//增加新的文件状态标志
val|=flag;
//重新设置文件状态标志
fcntl(fd,f_SETFL,val);

// 2 修改文件状态
//获取原来的文件状态标志
int val=fcntl(fd,f_GETFL);
//清除指定的文件状态标志
val&=~flag;
//重新设置文件状态标志
fcntl(fd,f_SETFL,val);

4、I/O处理的五种模型

1)、阻塞I/O模型
若所调用的I/O函数没有完成相关的功能就会使进程挂起,直到相关数据到达才会返回。如:终端、网络设备的访问。
2)、非阻塞模型
当请求的I/O操作不能完成时,则不让进程休眠,而且返回一个错误。如:open read write请问。
3)、I/O多路转接模型
如果请求的I/O操作阻塞,且他不是真正阻塞I/O,而且让其中的一个函数等待,在这期间,I/O还能进行其他操作。如:select函数
4)、信号驱动I/O模型
在这种模型下,通过安装一个信号处理程序,系统可以自动捕获特定信号的到来,从而启动I/O。
5)、异步I/O模型
在这种模型下,当一个描述符已准备好,可以启动I/O时,进程会通知内核。由内核进行后续处理,这种用法现存较少。

非阻塞I/O

  • 低速系统调用时,进程可能会阻塞
  • 非阻塞I/O确定操作(read open write)不阻塞,如果操作不能完成,则出错返回。
  • 设定非阻塞的方式
    • 使用open打开文件,设置o_NONBOCK标志。
    • 如果一个文件已经打开,则使用fcntl修改文件状态标志。
//设置非阻塞IO
set_fl(STDIN_FILENO,O_NONBLOCK);

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

外汇天眼:投资者关注!Cboe与MSCI发布多样化指数期权和波动率指数

芝加哥期权交易所全球市场&#xff08;Cboe Global Markets&#xff09;与摩根士丹利资本国际&#xff08;MSCI&#xff09;合作推出新的指数期权和波动率指数 芝加哥期权交易所全球市场&#xff08;Cboe Global Markets, Inc.&#xff09;今天宣布与MSCI Inc.&#xff08;MSC…

Python性能测试框架Locust实战教程

01、认识Locust Locust是一个比较容易上手的分布式用户负载测试工具。它旨在对网站&#xff08;或其他系统&#xff09;进行负载测试&#xff0c;并确定系统可以处理多少个并发用户&#xff0c;Locust 在英文中是 蝗虫 的意思&#xff1a;作者的想法是在测试期间&#xff0c;放…

【生成式AI】ChatGPT原理解析(1/3)- 对ChatGPT的常见误解

Hung-yi Lee 课件整理 文章目录 误解1误解2ChatGPT真正在做的事情-文字接龙 ChatGPT是在2022年12月7日上线的。 当时试用的感觉十分震撼。 误解1 我们想让chatGPT讲个笑话&#xff0c;可能会以为它是在一个笑话的集合里面随机地找一个笑话出来。 我们做一个测试就知道不是这样…

【论文笔记之 YIN】YIN, a fundamental frequency estimator for speech and music

本文对 Alain de Cheveigne 等人于 2002 年在 The Journal of the Acoustical Society of America 上发表的论文进行简单地翻译。如有表述不当之处欢迎批评指正。欢迎任何形式的转载&#xff0c;但请务必注明出处。 论文链接&#xff1a;http://audition.ens.fr/adc/pdf/2002_…

[C++]18:set和map的使用

set和map的使用 一.关联式容器&#xff1a;1.简单概念&#xff1a;2.<key , value>--->键值对3.set和map的底层结构&#xff08;平衡搜索树或者红黑树&#xff09; 二.set1.set (排序不重复)1.模板参数&#xff1a;2.set是一个有序存储的容器&#xff1a;3.set中每个数…

iconfont的组件化使用方法(SVG)

目录 一、需求描述二、操作步骤1.在iconfont中选择项目需要使用的图标2.在项目中创建iconfont.js3.创建svgIcon组件 一、需求描述 将iconfont图标库选择的图标以SVG的形式引入项目并通过组件化的形式在项目中引用可控制图标的大小和颜色 二、操作步骤 1.在iconfont中选择项目…

H264/H265基本编码参数1

本文主要讲解一些视频编码相关的基本概念 像素 像素是图像的基本单元&#xff0c;一个个像素就组成了图像。你可以认为像素就是图像中的一个点。我们来直观地看看像素是怎么组成图像的。在下面这张图中&#xff0c;你可以看到一个个方块&#xff0c;这些方块就是像素。 分辨…

猫头虎分享已解决Bug || TypeError: Object(...) is not a function (React Hooks)

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

vue3 使用qrcodejs2-fix生成二维码并可下载保存

直接上代码 <el-button click‘setEwm’>打开弹框二维码</el-button><el-dialog v-model"centerDialogVisible" align-center ><div class"code"><div class"content" id"qrCodeUrl" ref"qrCodeUrl&q…

C++ //练习 9.18 编写程序,从标准输入中读取string序列,存入一个deque中。编写一个循环,用迭代器打印deque中的元素。

C Primer&#xff08;第5版&#xff09; 练习 9.18 练习 9.18 编写程序&#xff0c;从标准输入中读取string序列&#xff0c;存入一个deque中。编写一个循环&#xff0c;用迭代器打印deque中的元素。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&am…

成都直播基地产业合规指南 共促直播行业和谐发展

随着互联网技术的不断发展&#xff0c;直播行业正迅速崛起&#xff0c;成为当今社会最具有影响力和商业价值的行业之一。而作为直播行业中的重要组成部分&#xff0c;各大互联网机构在推动直播产业发展的过程中扮演着至关重要的角色。天府锋巢直播产业基地作为成都规模最大的直…

微服务篇之任务调度

一、xxl-job的作用 1. 解决集群任务的重复执行问题。 2. cron表达式定义灵活。 3. 定时任务失败了&#xff0c;重试和统计。 4. 任务量大&#xff0c;分片执行。 二、xxl-job路由策略 1. FIRST&#xff08;第一个&#xff09;&#xff1a;固定选择第一个机器。 2. LAST&#x…

FreeRTOS 的队列基础API函数的使用

参考教程来源 //* 实验平台:启明欣欣 STM32F407应用开发板(高配版) 参考正点原子 #include "freertos_demo.h" #include "./SYSTEM/usart/usart.h" #include "led.h" #include "lcd.h" #include "key.h"/*FreeRTOS*********…

C++类和对象篇

1.类的定义 在C语言结构体中&#xff0c;只能定义变量&#xff0c;C扩展了类的概念&#xff0c;能够在类定义函数&#xff1b;同时&#xff0c;struct仍然可以使用&#xff0c;但更常用class来表示类 1.1类中函数的两种定义方式 函数的声明和定义都在类中 class Date { public:…

Pytorch训练RCAN QAT超分模型

Pytorch训练RCAN QAT超分模型 版本信息测试步骤准备数据集创建容器生成文件列表创建文件列表的代码执行脚本,生成文件列表训练RCAN模型准备工作修改开源代码编写训练代码执行训练脚本可视化本文以RCAN超分模型为例,演示了QAT的训练过程,步骤如下: 先训练FP32模型再加载FP32训练…

Qt QWidget 简约美观的加载动画 第二季

&#x1f603; 第二季来啦 &#x1f603; 简约的加载动画,用于网络查询等耗时操作时给用户的提示. 这是最终效果: 一共只有三个文件,可以直接编译运行 //main.cpp #include "LoadingAnimWidget.h" #include <QApplication> #include <QVBoxLayout> #i…

LeetCode704. 二分查找(C++)

LeetCode704. 二分查找 题目链接代码 题目链接 https://leetcode.cn/problems/binary-search/description/ 代码 class Solution { public:int search(vector<int>& nums, int target) {int left 0;int right nums.size() - 1;while(left < right){int midd…

主机字节序与网络字节序

大端序和小端序 大端序&#xff08;Big Endian&#xff09;和小端序&#xff08;Little Endian&#xff09;是两种计算机存储数据的方式。 大端序指的是将数据的高位字节存储在内存的低地址处&#xff0c;而将低位字节存储在内存的高地址处。这类似于我们阅读多位数时从左往右…

1.0 RK3399项目开发实录-Ubuntu环境搭建(物联技术666)

1.下载Ubuntu所需的版本&#xff1a;Index of /releases 2.安装vmplayer:Download VMware Workstation Player | VMware 3.安装Ubuntu时&#xff0c;磁盘空间尽量大些&#xff0c;开发板系统包都比较大&#xff0c;避免存不下&#xff0c;建议空间100G。 关闭Ubuntu自动更新…

卡玛网● 46. 携带研究材料 ● 01背包问题,你该了解这些! 滚动数组 力扣● 416. 分割等和子集

开始背包问题&#xff0c;掌握0-1背包和完全背包即可&#xff0c;注&#xff1a;0-1背包是完全背包的基础。 0-1背包问题&#xff1a;有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品只能用一次&#xff0c;求…