【系统调用IO】open、close、read、write、lseek

目录

  • 3 系统调用IO
    • 3.1 文件描述符
      • 3.1.1 FILE结构体
      • 3.2.2 文件描述符
    • 3.3 open、close、read、write、lseek
      • 3.3.1 文件权限
      • 3.3.2 open
      • 3.3.3 close
      • 3.3.4 read
      • 3.3.5 write
      • 3.3.6 lseek
      • 3.3.7 代码示例
  • 文件io和标准io的区别

橙色

3 系统调用IO

3.1 文件描述符

3.1.1 FILE结构体

查看stdio.h头文件中,有FILE结构体的定义:

//stdio.h
typedef struct _iobuf {char*  _ptr;        //文件输入的下一个位置int    _cnt;        //当前缓冲区的相对位置char*  _base;       //文件初始位置int    _flag;       //文件标志int    _file;       //文件有效性int    _charbuf;    //缓冲区是否可读取int    _bufsiz;     //缓冲区字节数char*  _tmpfname;   //临时文件名
} FILE;

其中_file就是文件描述符。

3.2.2 文件描述符

文件描述符(fd,file descriptor)是文件IO(也系统IO)中贯穿始终的类型。如下图所示:

3.3 open、close、read、write、lseek

3.3.1 文件权限

关于文件权限的相关内容请参考该篇博客:【Linux】用户管理(添加用户、修改密码、删除用户、查询用户信息、切换用户、查看当前用户、用户组)

另外补充一个知识点:

umask

Linux具有默认权限:

  • 一个目录被创建,默认权限是drwxrwxrwx,即777
  • 一个普通文件被创建,默认权限是-rw-rw-rw-,即666

但实际上所创建的文件和目录,看到的权限往往不是上面这个值。原因就是创建文件或目录的时候还要受到 umask 的影响。umask值表明了需要从默认权限中去掉哪些权限来成为最终的默认权限值。

在这里插入图片描述

3.3.2 open

open用于打开或创建一个文件或者设备。

所在头文件:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

函数原型:

int open(const char *pathname, int flags);
//当flag包含O_CREAT时,下面这个三个参数的
int open(const char *pathname, int flags, mode_t mode);
  • 将准备打开的文件或是设备的名字作为参数path传给函数,flags用来指定文件访问模式。
  • open系统调用成功返回一个新的文件描述符,失败返回-1。

其中,flags是由必需文件访问模式和可选模式一起构成的(通过按位或|):
在这里插入图片描述

3.3.3 close

在这里插入图片描述

3.3.4 read

在这里插入图片描述

3.3.5 write

在这里插入图片描述

3.3.6 lseek

在这里插入图片描述

3.3.7 代码示例

一个copy的代码:

#include<stdio.h>
#include<stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#define BUFFSIZE 1024int main(int argc,char** argv){int len,ret,pos;int fds,fdd;char buf[BUFFSIZE];if(argc<3){fprintf(stderr,"input error");}fds=open(argv[1],O_RDONLY);if(fds<0){perror("open");}fdd=open(argv[2],O_WRONLY|O_CREAT,O_TRUNC,0600);if(fdd<0){close(fds);perror("open");}while(1){len=read(fds,buf,BUFFSIZE);if(len<0){perror("read");break;}else if(len==0){break;}pos=0;while(len >0){ret=write(fdd,buf+pos,len);if(ret<0){perror("write");break;}len-=ret;pos+=ret;}}close(fdd);close(fds);exit(0);
}

文件io和标准io的区别

文件io(系统调用io)响应速度快,它在输出端没有缓冲区,有数据来了,就直接处理;标准io吞吐量更大,因为它有缓冲区,所以是等满足一定条件了,再把缓冲区中的数据一起发送出去。
从实际的用户体验来说,吞吐量大会感觉更快。所以在文件io和标准io都能够调用的时候,选择标准io是更好的。

提醒:文件io和标准io不可以混用

一个小例子:

#include<stdio.h>
#include<stdlib.h>
#include <unistd.h>
#define BUFFSIZE 1024int main(){putchar('a');write(1,"b",1);putchar('a');write(1,"b",1);putchar('a');write(1,"b",1);exit(0);
}

输出结果:bbbaaa

很好的印证了上面所说的标准IO和系统IO的区别,write是系统IO,所以立即输出;而putchar是标准IO,有缓冲区,并未立即输出。

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

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

相关文章

多线程编程1

一、线程的引入 上节&#xff0c;我们介绍了进程的概念&#xff0c;以及操作系统内核是如何管理进程的&#xff08;描述组织&#xff09;&#xff0c;PCB中的核心属性有哪些&#xff0c; 引入进程这个概念&#xff0c;最主要的目的&#xff0c;就是为了解决“并发编程”这样的…

JavaScript语法摘要

JavaScript语法摘要 JavaScript语法通过各种规则和组合&#xff0c;就能创建出丰富多彩的程序呢&#xff01;它包括了怎么声明和使用变量、如何定义和赋值&#xff0c;还有怎么用运算符和表达式等等。另外&#xff0c;我还发现了一些有趣的概念&#xff0c;比如关键字、注释、…

探索Flask中的RESTful API设计与实现

Restful API 基础介绍&#xff1a; ​ RESTful API&#xff08;Representational State Transfer&#xff09;是一种基于HTTP协议设计的应用程序编程接口&#xff08;API&#xff09;风格&#xff0c;用于在客户端和服务器之间进行通信。它提供了一组规范和约束&#xff0c;用…

Python学习从0到1 day7 Python判断语句

路远殊途&#xff0c;祝你得偿所愿 ——24.1.21 前言 进行逻辑判断&#xff0c;是生活中常见的行为&#xff0c;同样&#xff0c;在程序中&#xff0c;进行逻辑判断也是最为基础的功能 一、布尔类型和比较运算符 1.布尔类型 进行判断&#xff0c;有两个结果&#xff0c;True、…

C 练习实例37 - 排序

题目&#xff1a;对10个数进行排序。 从小到大排序题目分析&#xff1a; 1 6 3 4 8 9 0 2 5 7&#xff08;假设10个数据&#xff09; 第一个和第二个比&#xff0c;把大的那个数放在右边 第二个和第三个比&#xff0c;把大的那个数放在右边 以此类推...... 从而把最大的那…

springboot集成COS对象存储

1.申请腾讯云存储桶 新建密钥&#xff08;后面配置要用到&#xff09; 2.编写工具类 此处使用工具类进行基本属性配置&#xff0c;也可选择在yml中配置 package com.sfy.util;import com.qcloud.cos.COSClient; import com.qcloud.cos.ClientConfig; import com.qcloud.cos.a…

基于xgboost-LGBM-SVM的病人哮喘病识别检测 数据+代码

基于xgboost-LGBM-SVM的病人哮喘病识别检测-完整代码可直接运行_哔哩哔哩_bilibili 代码: from sklearn import preprocessing import random from sklearn.model_selection import train_test_split from sklearn.preprocessing import MinMaxScaler from sklearn import pr…

声明式注解对XXL-JOB的定时任务代码生效吗?

说明&#xff1a;源于博主的思考&#xff0c;本文验证一下声明式注解&#xff0c;即Transactional注解&#xff0c;对XXL-JOB的定时任务是否生效。 准备 首先&#xff0c;创建一个需要事务的场景。有两张表&#xff0c;一张部门表&#xff0c;一张用户表&#xff0c;用户隶属…

字符串经典基础面试题(算法村第十二关白银挑战)

反转问题 反转字符串 344. 反转字符串 - 力扣&#xff08;LeetCode&#xff09; 编写一个函数&#xff0c;其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的数组分配额外的空间&#xff0c;你必须**原地修改输入数组**、使用 O(1) 的额外…

基于YOLOv8的目标识别、计数、电子围栏的项目开发过程

0 前言 用于生产环境中物体检测、识别、跟踪&#xff0c;人、车流量统计&#xff0c;越界安全识别 1 YOLOv8概述 YOLOv8 是Ultralytics的YOLO的最新版本。作为一种前沿、最先进(SOTA)的模型&#xff0c;YOLOv8在之前版本的成功基础上引入了新功能和改进&#xff0c;以提高性…

cupy,一个超级实用的 Python 库!

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 大家好&#xff0c;今天为大家分享一个超级实用的 Python 库 - cupy。 Github地址&#xff1a;https://github.com/cupy/cupy 深度学习和科学计算需要处理大规模的数据和复杂的计算任务&#xff0c;而Python是一…

spring boot 常用的 Cron 表达式

在使用定时调度任务的时候&#xff0c;我们最常用的&#xff0c;就是cron表达式了。通过cron表达式来指定任务在某个时间点或者周期性的执行。cron表达式配置起来简洁方便&#xff0c;无论是Spring的Scheduled还是用Quartz框架&#xff0c;都支持cron表达式。 cron表达式含义常…

C语言易忘操作符全集

位操作符 1.按位与(&) 这个操作符对两个整数的每一位进行比较&#xff0c;如果两个相应的位都为1&#xff0c;则结果为1&#xff0c;否则为0。 int a 60; // 60 0010 1100 in binary int b 13; // 13 0000 1101 in binary int c a & b; // c 0000 110…

tag 标签

tag 标签 在使用 Git 版本控制的过程中&#xff0c;会产生大量的版本。如果我们想对某些重要版本进行记录&#xff0c;就可以给仓库历史中的某一个commit 打上标签&#xff0c;用于标识。 在本章中&#xff0c;我们将会学习如何列出已有的标签、如何创建和删除新的标签、以及…

20240116使用Firefly的AIO-3399J的预编译的Android10固件确认RT5640声卡信息

20240116使用Firefly的AIO-3399J的预编译的Android10固件确认RT5640声卡信息 2024/1/16 17:55 百度&#xff1a;RK3399 ALC5640 RK3399 RT5640 BING&#xff1a;RK3399 ALC5640 LINE-IN接麦克风不会有声音的。 耳机只有右边有声音&#xff0c;但是偏小&#xff0c;可以通过音量…

计算机安全学习笔记(VI):9道关于网络安全的练习题

1.哪个 UDP 字段用于检测数据报损坏&#xff1f; a. 总长度b. 目的端口c. 校验和d. 源端口 正确答案是&#xff1a; c. 校验和(Checksum) 在UDP&#xff08;用户数据报协议&#xff09;中&#xff0c;校验和&#xff08;Checksum&#xff09;字段用于检测数据报文的完整性。…

C++ memmove 学习

memmove&#xff0c;将num字节的值从源指向的位置复制到目标指向的内存块。 允许目标和源有重叠。 当目标区域与源区域没有重叠则和memcpy函数功能相同。 宽字符版本是wmemmove&#xff0c;安全版本加_s&#xff1b; #include "stdafx.h" #include<iostream&g…

如何为不同品牌的笔记本电脑设置充电限制,这里提供详细步骤

笔记本电脑的电池健康状况至关重要。延长电池寿命可以帮你省下不少钱。对于长时间充电的Windows 11笔记本电脑用户来说,将电池电量限制在80%是很重要的。 虽然操作系统没有提供设置自定义电池充电限制的内置方法,但仍有一些方法可以在Windows 11中配置电池设置,并将其限制在…

华南理工大学数字信号处理实验实验一(薛y老师版本)matlab源码

一、实验目的 1、加深对离散信号频谱分析的理解&#xff1b; 2、分析不同加窗长度对信号频谱的影响&#xff1b; 3、理解频率分辨率的概念&#xff0c;并分析其对频谱的 影响&#xff1b; 4、窗长和补零对DFT的影响 实验源码&#xff1a; 第一题&#xff1a; % 定义离散信…

面试题-MySQL如何定位慢查询

慢查询出现的情况就这些&#xff1a;聚合查询、多表查询、表数据量过大查询、深度分页查询。 表象&#xff1a;页面加载过慢、接口压测响应时间过长&#xff08;超过1S&#xff09;。 假如你的业务接口就是比较慢&#xff0c;你怎么知道是SQL的问题呢&#xff1f;就算是SQL的…