【linux】linux系统调用及文件IO操作

一、系统调用

1、概述 

        系统调用: 就是操作系统内核 提供给用户可以操作内核 一组函数接口。用户 借助 系统调用 操作内核。比如用户可以通过文件系统相关的调用请求系统打开文件、关闭文件或读写文件,可以通过时钟相关的系统调用获得系统时间或设置定时器等。

        进程的空间分为:内核空间 和 用户空间。系统调用是属于操作系统内核的一部分,运行在内核态下,通过软件中断切换到内核态。

2、系统调用和库函数区别

系统调用 是内核提供的一组函数接口。

库函数 是第三方(用户提供)的函数接口。

        如果库函数没有调用系统调用该库函数不能操作内核。比如:字符串操作函数strcpy, bzero

        如果库函数 调用 系统调用该库函数能操作内核。比如:fopen fclose fwrite fget

3、系统调用及IO操作 

        系统调用是需要时间的,程序中频繁的使用系统调用会降低程序的运行效率。 文件IO中缓冲区刷新机制需要内核管理,库函数访问文件的时候根据需要,设置不同类型的缓冲区,从而减少了直接调用IO系统调用的次数,提高了访问效率。

二、文件描述符

1、概述 

        在 Linux的世界里一切设备皆文件,我们可以系统调用I/O 的函 数(I:input,输入;0:output..输出),对文件进行相应的操作 ( open()、close()、write()、read()等。

        打开现存文件或新建文件时,系统(内核)会返回一个文件描述符,文件描述符用来指定已打开的文件。这个文件描述符相当于这个已打开文件的标号,文件描述符是非负整数,是文件的标识,操作这个文件描述符相当于操作这个描述符所指定的文件。

        Linux将系统调用 打开或新建的文件 用非负整数 来表示。而这个非负整数 就是文件描述 符。

        系统会为每一个进程文件 分配一个文件描述符表管理该进程的所有文件描述符

        系统会为 每一个进程文件 打开三个文件描述符:0,1,2

  • 0:标准输入设备(键盘) scanf
  • 1:标准输出设备(终端)printf
  • 2:标准错误输出 (终端)perror

2、文件描述符表对文件描述符的管理

         文件描述符表 是通过 “位图” 来管理文件描述符。使用1024位(0-1023)二进制位管理,位数代表 的就是文件描述符,位上的值1表示打开,值0表示关闭,前三位(0-2)为标准文件描述符。打开文件的时候默认选择最小可用的文件描述符(3)给打开的文件用。

3、查看当前系统文件描述符最大数量ulimit -a

        查看命令:ulimit -a

修改命令:ulimit -n 2048 

 

三、文件IO的操作

        文件常用操作IO:open close read write

1、打开文件 open 

头文件: 

#include<sys/type.h>

#include<sys/stat.h>

#include <funtl.h>

相关函数: 

 函数功能: 打开文件,如果文件不存在则可以选择创建。

//二参数open用于 打开已存在的文件

int open(const char *pathname, int flags);

//三参数open用于 打开不存在的文件 mode是文件在磁盘上的权限 

int open(const char *pathname, int flags, mode_t mode);

//返回值:成功返回最小文件描述符,失败返回-1

参数:

  • pathname:文件的路径及文件名
  • flags:打开文件的行为标志,必选项 O_RDONLY(以只读方式打开, O_WRONLY(以只写方式打开), O_RDWR(以可读可写方式打开) 
  • mode:这个参数,只有在文件不存在时有效,指新建文件时指定文件的磁盘权限

 flags 文件的操作权限可选项,和必选项按位或起来:

取值含义
O_CREAT文件不存在则创建文件,文件存在则先删除再重新创建文件,使用此选项时需使用mode说明文件的权限
O_EXCL如果同时指定了O_CREAT,且文件已经存在,则出错(防止已有文件被删除)
O_TRUNC如果文件存在,则清空文件内容
O_APPEND写文件时,数据添加到文件末尾
O_NONBLOCK对于设备文件, 以O_NONBLOCK方式打开可以做非阻塞I/O

mode文件在磁盘的用户权限:

        磁盘文件的用户权限分类:所有拥有者权限(u)、同组用户权限(g)、其他用户权限(o)

 权限分为:读(4)、写(2)、执行(1),可以相互组合:

7--->可读可写可执行         6--->可读可写         5--->可读可执行

4--->只读        3--->可写可执行         2--->只写         1--->可执行

mode的权限表示0xxx 每一个x都是4、2、1的组合,如:

前第一个0代表其为八进制数:

0777 所有者、同组用户、其他用户都是可读可写可执行

0666 所有者、同组用户、其他用户都是可读可写

查看mode的系统权限掩码umask

        查看掩码命令:umask

 文件的最终权限=给定的权限异或掩码( & ~umask)

umask mode:设置掩码,mode为八进制数

umask -S:查看各组用户的默认操作权限

2、close 关闭文件描述符

        头文件:#include<unistd.h>

        函数:int close(int fd);

功能: 关闭已打开的文件

参数: fd : 文件描述符,open()的返回值

返回值: 成功:0 失败: -1并存放在全局变量errno中

        注意:close工作步骤,先将文件描述符的数量-1,当文件描述符的数量变为0的时候 ,系统回收文件描述符所占的内核空间。

 3、向文件写数据write

头文件:#include<unistd.h>

函数:size_t write(int fd, const void *buf, size_t count);

功能: 把指定数目的数据写到文件fd中

参数:

        fd : 文件描述符

        buf : 数据首地址

        count : 写入数据的长度(字节)

返回值: 成功:实际写入数据的字节个数 失败: - 1 

4、read读取文件数据

        #include<unistd.h>

        size_t read(int fd, void *buf, size_t count);

功能: 把指定数目的数据读到内存(缓冲区)

参数:

        fd : 文件描述符

        buf : 内存首地址

        count : 读取的字节个数

返回值: 成功:实际读取到的字节个数,读完文件数据返回0         失败: - 1 

 5、综合案例:实现cp(copy)命令

        举例:cp b.txt test 将b.txt文件拷贝到test目录中

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/fcntl.h>
int main(int argc,char *argv[])//argc为传参个数,指针数组argv存放每个参数的内容
{
    //判断参数是否正确(./a.out a.txt test)
    //若正确,argc=3,argv[0]=./a.out,argv[1]=a.txt,argy[2]=test
    if(argc!=3)
    {
        printf("缺少参数");
        return 0;
    }
    //以只读的方式 打开a.txt文件
    int fp_r=open(argv[1],O_RDONLY);
    if(fp_r<0)
    {
        perror("open");
        return 0;
    }
    //以写的方式 在test目录中打开a.txt
    char filename[32]="";
    sprintf(filename,"%s/%s",argv[2],argv[1]);
    int fp_w=read(filename,O_WRONLY|O_CREAT,0666);
    if(fp_w<0)
    {
        perror("open");
        return 0;
    }

    //不同的从fd_r中读取文件数据 写入fd_w文件中
    while(1)
    {
    unsigned char buf[128]="";
    int len=read(fp_r,buf,sizeof(buf));
    if(len<=0)
        break;
    printf("读取的数据大小为%d",len);
    write(fp_w,buf,sizeof(buf));
    }
    //关闭文件
    close(fp_r);
    close(fp_w);
    return 0;
}

四、文件的阻塞特性 

        对于一些设备文件读写操作,如管道,套接字,标准设备文件,默认缓冲区没有数据读会带阻塞,默认缓存区满的状态,写也会阻塞。

        文件描述符决定阻塞和非阻塞,而不是read write函数。文件描述符默认为阻塞的。

1、open打开文件 默认为阻塞特性

        文件描述符 事先不存在用open。如果从终端输入的数据没有换行符,默认调用read读终端设备就会阻塞。

2、 open打开文件 设置为非阻塞特性

3、通过fcntl设置文件的阻塞特性 

        文件描述符事先存在用funtl。 功能:改变已打开的文件性质,fcntl针对描述符提供控制。

头文件:

#include<unistd.h>

#include<fcntl.h>

函数:

int fcntl(int fd, int cmd, ... /* arg */ );

参数:

fd:操作的文件描述符

cmd:操作方式

arg:针对cmd的值,fcntl能够接受第三个参数int arg。

返回值: 成功:返回某个其他值 失败:-1

fcntl函数有5种cmd功能:

  1.  复制一个现有的描述符(cmd=F_DUPFD)
  2. 获得/设置文件描述符标记(cmd=F_GETFD或F_SETFD)
  3. 获得/设置文件状态标记(cmd=F_GETFL或F_SETFL)
  4. 获得/设置异步I/O所有权(cmd=F_GETOWN或F_SETOWN)
  5. 获得/设置记录锁(cmd=F_GETLK, F_SETLK或F_SETLKW) 

设置一个存在的文件描述符的阻塞特性的步骤

  1. fcntl获取文件描述符的状态标记
  2. 修改 获取到的 文件描述符的状态标记
  3. 将修改后的状态标记 使用fcntl设置到文件描述符中 

五、获取文件的状态信息

头文件: 

#include<sys/type.h>

#include<sys/stat.h>

#include<unistd.h>

函数: 

int stat(const char *path, struct stat *buf);

int lstat(const char *pathname, struct stat *buf);  

功能: 获取文件状态信息

        stat和lstat的区别: 当文件是一个符号链接时,lstat返回的是该符号链接本身的信息; 而stat返回的是该链接指向的文件的信息。

参数:

path/pathname:文件名

buf:保存文件信息的结构体

返回值: 成功: 0 失败: -1 

struct stat结构体说明:

struct stat {
    dev_t st_dev; //文件的设备编号
    ino_t st_ino; //节点
    mode_t st_mode; //文件的类型和存取的权限
    nlink_t st_nlink; //连到该文件的硬连接数目,刚建立的文件值为1
    uid_t st_uid; //用户ID
    gid_t st_gid; //组ID
    dev_t st_rdev; //(设备类型)若此文件为设备文件,则为其设
备编号
    off_t st_size; //文件字节数(文件大小)
    blksize_t st_blksize; //块大小(文件系统的I/O 缓冲区大小)
    blkcnt_t st_blocks; //块数
    time_t st_atime; //最后一次访问时间
    time_t st_mtime; //最后一次修改时间
    time_t st_ctime; //最后一次改变时间(指属性)
};

 st_mode(16位整数)参数说明 :

        由于上述形式的测试是普通的,因此POSIX定义了其他宏,以便更简洁地编写st_mode中的文件类型测试:

S_ISREG(st_mode)

是否是普通文件(regular file)
S_ISDIR(st_mode)是否是目录文件(directory)
S_ISCHR(st_mode)是否是字符设备(character device)
S_ISBLK(st_mode)块设备(block device)
S_ISFIFO(st_mode)管道
S_ISLNK(st_mode)符号链接(软连接)

st_mode控件的文件模式组件定义了下列掩码值:

六、文件目录操作 

        读取一个目录下的所有文件名 

1、打开目录(得到文件目录的句柄)

头文件:

#include<sys/types.h>

#include<dirent.h>

函数:

DIR *opendir(const char *name);

功能:打开一个目录

参数name:目录名

返回值: 成功:返回指向该目录结构体指针 失败:NULL

2、读取目录 

#include<dirent.h>

struct dirent *readdir(DIR *dirp);  

功能:读取目录 调用一次只能读取一个文件

参数 dirp:opendir的返回值

返回值: 成功:目录结构体指针 失败:NULL 

 结构体dirent说明:

struct dirent
{
    ino_t d_ino; // 此目录进入点的inode
    off_t d_off; // 目录文件开头至此目录进入点的位移
    signed short int d_reclen; // d_name 的内容长度, 不包含NULL 字符
    unsigned char d_type; // d_type 所指的文件类型
    char d_name[256]; // 文件名
};

d_type相关数据:

 3、关闭目录

头文件:

#include<sys/types.h>

#include<dirent.h>

函数:

int closedir(DIR *dirp);

功能:关闭目录

参数dirp:opendir返回的指针

返回值: 成功:0 失败:-1 

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

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

相关文章

win中删除不掉的文件,火绒粉碎删除亲测有效

看网上的 win R 然后终端输入什么删除的&#xff0c;照做了都没有删掉 有火绒的可以试试&#xff1a; 拖进去就删掉了 很好使

NTFS Disk by Omi NTFS for mac v1.1.4中文版

NTFS Disk by Omi NTFS for Mac&#xff1a;NTFS文件系统的无缝桥梁 软件下载&#xff1a;NTFS Disk by Omi NTFS for mac v1.1.4中文版 &#x1f310; 跨平台访问&#xff0c;文件无阻 NTFS Disk by Omi NTFS for Mac 为您的Mac提供了对NTFS文件系统的无缝访问。无论您是在Win…

通过联合部署DDoS高防和WAF提升网站防护能力

如果您的网站遭受的攻击既有流量型攻击&#xff0c;又混杂精巧的Web应用层攻击时&#xff08;例如SQL注入、跨站脚本攻击、命令注入等&#xff09;时&#xff0c;推荐您组合使用阿里云DDoS高防和Web 应用防火墙 WAF&#xff08;Web Application Firewall&#xff09;&#xff0…

demo破坏升级

如果我们刚才所解释的dom破坏形式不再是单纯的x一层结构&#xff0c;而是x&#xff0c;y这种形式&#xff0c;两层结构&#xff0c;我们该怎么办 举个例子吧 我们的想法是先取x再取y&#xff0c;想法很简单&#xff0c;现实很苦感&#xff0c;看看结果吧 取出来的是undefined…

stm32flash模拟eeprom

stm32f103CB的flash是128k&#xff08;起始地址是 0x08000000 到 0x0801FFFF&#xff09; falsh的末地址是0x801FFFF&#xff0c;即倒数一页是0x801FBFF&#xff08;1页按照1kB1024B来算&#xff09; stm32f103参考手册stm32f103cb.pdf stm32的FLASH分为主存储块和信息块&…

【C++庖丁解牛】初始化列表 | Static对象 | 友元函数

&#x1f4d9; 作者简介 &#xff1a;RO-BERRY &#x1f4d7; 学习方向&#xff1a;致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f4d2; 日后方向 : 偏向于CPP开发以及大数据方向&#xff0c;欢迎各位关注&#xff0c;谢谢各位的支持 目录 1. 再谈构造函数1.1 …

总结zy_不定长数据帧的收发

1、接收部分 身份证模块串口接收解析&#xff1a; #define CRC_16_CCITT 0x1021 unsigned short CRC16_CCITT(unsigned char* pchMsg, unsigned short wDataLen) // 1. MSB { unsigned char i, chChar; unsigned short wCRC 0; while (wDataLen–) { chChar *pchMsg; wCRC ^…

电脑安装原版Windows7详细教程

前言 截止2024年3月3日&#xff0c;仍然有不少小伙伴想给电脑安装Windows7。所以今天给小伙伴们出一篇电脑安装原版Windows7的详细教程。 首先要知道部分CPU&#xff08;第六代或以上英特尔、AMD Ryzen系列&#xff09;平台并不支持Windows7&#xff0c;原因是有部分硬件设备…

前端监控为什么采用GIF图片做埋点?

一、什么是埋点监控 前端监控是开发人员用来跟踪和维护应用程序表现层的运行状况的过程和工具。它主要包括三种类型&#xff1a;数据监控、性能监控和异常监控。 1、数据监控 主要是为了收集跟用户相关的数据&#xff0c;例如用户设备类型、浏览器版本、页面浏览量&#xff08;…

【MGR】MySQL Group Replication 背景

目录 17.1 Group Replication Background 17.1.1 Replication Technologies 17.1.1.1 Primary-Secondary Replication 17.1.1.2 Group Replication 17.1.2 Group Replication Use Cases 17.1.2.1 Examples of Use Case Scenarios 17.1.3 Group Replication Details 17.1…

每日一题——LeetCode1582.二进制矩阵中的特殊位置

方法一 模拟 先把矩阵每一行和每一列中1的数量统计出来&#xff0c;然后遍历矩阵&#xff0c;元素为1的位置看他所在的行和列的1的数量是否都为1即为满足题意的点 var numSpecial function(mat) {let m mat.length, n mat[0].lengthlet rows new Array(m).fill(0)let col…

SOAPHound:一款功能强大的基于ADWS协议的活动目录环境枚举工具

关于SOAPHound SOAPHound是一款功能强大的基于ADWS协议的活动目录环境枚举工具&#xff0c;该工具本质上是一个.NET数据收集工具&#xff0c;可以帮助广大研究人员通过活动目录Web服务&#xff08;ADWS&#xff09;协议来收集目标活动目录的相关数据&#xff0c;从而实现活动目…

鸿蒙Harmony应用开发—ArkTS声明式开发(通用属性:组件内容模糊)

为当前组件添加内容模糊效果。 说明&#xff1a; 从API Version 10开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 foregroundBlurStyle foregroundBlurStyle(value: BlurStyle, options?: ForegroundBlurStyleOptions) 为当前组件提供…

【前端】i18n Ally插件使用

效果展示&#xff1a; 当鼠标放上去 vscode扩展搜i18n Ally 由于每个项目的语言可能做的都不一样&#xff0c;会导致无法找到真正的路径位置&#xff0c;所以我推荐 在项目的根目录找到.vscode再找到settings.json编辑它 比如我的翻译文件en.ts和zh-CN.ts&#xff0c;都在s…

Android使用陀螺仪

Android使用陀螺仪 陀螺仪基础运用与理解 在Android应用中使用陀螺仪可以帮助实现各种功能&#xff0c;比如游戏控制、虚拟现实体验、运动追踪等。以下是使用Android陀螺仪的基本步骤&#xff1a; 获取传感器服务&#xff1a; 首先&#xff0c;需要获取设备上的陀螺仪传感器服…

Java8 使用 stream().sorted()对List集合进行排序

集合对像定义 集合对象以学生类&#xff08;StudentInfo&#xff09;为例&#xff0c;有学生的基本信息&#xff0c;包括&#xff1a;姓名&#xff0c;性别&#xff0c;年龄&#xff0c;身高&#xff0c;生日几项。 使用stream().sorted()进行排序&#xff0c;需要该类实现 C…

Qt 实现橡皮擦拭显示图片

1.简介 在一些游戏中看见类似解密破案的效果&#xff0c;使用手触摸去擦拭图片上的灰尘&#xff0c;然后显示最终的图片&#xff0c;所以也想试试Qt实现的效果。大家有自己想做的效果&#xff0c;都可以尝试。 以下是效果展示图。 可以控制橡皮擦的大小&#xff0c;进行擦拭…

Python开发工具:pycharm使用注意事项以及设置

上一篇文章写了pycharm的安装以及运行&#xff0c;但是在安装过程中遇到了一些问题&#xff0c;接下来详细解析安装过程中遇到的问题&#xff0c;注意事项以及设置配置依赖等信息 安装遇到的问题&#xff1a; 协议许可证关闭不了&#xff1a;PyCharm安装完成后&#xff0c;打…

低代码平台开发——基于React(文末送书)

目录 小程一言适用对象本书达成 书籍介绍作者简介内容介绍书籍目录阅读指导 小程送书 小程一言 《低代码平台开发——基于React》这本书主要围绕低代码平台和React技术的结合展开&#xff0c;为读者提供了关于低代码平台开发的理论和实践知识。 ## 书中内容简介 书中内容分为…

AI大预言模型——ChatGPT与AI绘图及论文高效写作

原文链接&#xff1a;AI大预言模型——ChatGPT与AI绘图及论文高效写作 2023年随着OpenAI开发者大会的召开&#xff0c;最重磅更新当属GPTs&#xff0c;多模态API&#xff0c;未来自定义专属的GPT。微软创始人比尔盖茨称ChatGPT的出现有着重大历史意义&#xff0c;不亚于互联网…