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);

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python算法题集_全排列

Python算法题集_全排列 题46&#xff1a;全排列1. 示例说明2. 题目解析- 题意分解- 优化思路- 测量工具 3. 代码展开1) 标准求解【标记数组递归】2) 改进版一【指针递归】3) 改进版二【高效迭代模块】4) 改进版三【高效迭代模块极简代码】 4. 最优算法5. 相关资源 本文为Python…

猫头虎分享已解决Bug || 未找到资源:NotFoundError

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

qt debug和release运行都没问题打包之后运行不了

&#x1f482; 个人主页:pp不会算法^ v ^ &#x1f91f; 版权: 本文由【pp不会算法v】原创、在CSDN首发、需要转载请联系博主 &#x1f4ac; 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)和订阅专栏哦 问题 qt debug和release运行都没问题打包之后运行不了 原因 环…

编码器转动圈数和单圈脉冲数计算FB(博途SCL代码)

编码器测量相关内容&#xff0c;可以查看专栏相关文章。 1、Smart PLC多圈和单圈脉冲数计算 https://rxxw-control.blog.csdn.net/article/details/131777270https://rxxw-control.blog.csdn.net/article/details/131777270 1、博途PLC 计算FB 待续....

OpenCV开发笔记(七十五):相机标定矫正中使用remap重映射进行畸变矫正

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://blog.csdn.net/qq21497936/article/details/136293833 各位读者&#xff0c;知识无穷而人力有穷&#xff0c;要么改需求&#xff0c;要么找专业人士&#xff0c;要么自己研究 红胖子(红模仿…

2024Node.js零基础教程(小白友好型),nodejs新手到高手,(九)NodeJS入门——http模块

060_http模块_网页URL之绝对路径 hello&#xff0c;大家好&#xff0c;这一个小题的话我们来补充一个之前学习过的内容&#xff0c;就是网页当中的URL&#xff0c;咱们这个小题的话主要是来说一下绝对路径&#xff0c;有同学可能会说&#xff0c;这这这&#xff0c;不对劲&…

【c语言】字符函数和字符串函数(下)

前言 书接上回 【c语言】字符函数和字符串函数(上) 上一篇讲解的strcpy、strcat、strcmp函数的字符串长度是不受限制的 而本篇strncpy、strncat、strcnmp函数的字符串长度是受限制的 欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;…

Linux系统中前后端分离项目部署指南

目录 一.nginx安装以及字启动 解压nginx 一键安装4个依赖 安装nginx 启动 nginx 服务 开放端口号 并且在外部访问 设置nginx自启动 二.配置负载均衡 1.配置一个tomact 修改端口号 8081端口号 2.配置负载均衡 ​编辑 三.部署前后端分离项目 1.项目部署后端 ​编辑…

linux逻辑卷/dev/mapper/centos-root扩容增加空间

centos7中/dev/mapper/centos-root扩容 问题文件系统根目录&#xff0c;/dev/mapper/centos-root空间满了&#xff0c;导致k8s不停重启 1.查看磁盘情况 df -h #查看最大占用目录 du -h -x --max-depth12.查看磁盘信息 fdisk -l3.查看磁盘分区层级 lsblk可见剩余空闲60G空间…

进程间通信:共享内存与信号灯集(2024/2/26)

作业1&#xff1a;共享内存 shmsnd.c: #include <myhead.h> #define PAGE_SIZE 4096int main(int argc, const char *argv[]) {//一、创建key值key_t key-1;if((keyftok("/",k))-1){perror("ftok error");return -1;}//二、根据key值创建共享内存i…

开源软件的影响力:推动软件行业繁荣与技术创新

开源软件的影响力&#xff1a;推动软件行业繁荣与技术创新 随着信息技术的快速发展&#xff0c;开源软件已经成为软件开发的趋势&#xff0c;并产生了深远的影响。开源软件的低成本、可协作性和透明度等特点&#xff0c;使得越来越多的企业和个人选择使用开源软件&…

《论文阅读》一个基于情感原因的在线共情聊天机器人 SIGIR 2021

《论文阅读》一个基于情感原因的在线共情聊天机器人 前言简介数据集构建模型架构损失函数实验结果咨询策略总结前言 亲身阅读感受分享,细节画图解释,再也不用担心看不懂论文啦~ 无抄袭,无复制,纯手工敲击键盘~ 今天为大家带来的是《Towards an Online Empathetic Chatbot…