【系统调用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;比如关键字、注释、…

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

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

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;用户隶属…

基于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是一…

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;可以通过音量…

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; % 定义离散信…

【多线程的安全问题】synchronized 和 volatile——你必须知道的妙用!

&#x1f4c4;前言&#xff1a;本文的主要内容是讨论个人在多线程编程带来的安全问题的表现、原因以及对应的解决方法。 文章目录 一. 了解多线程安全问题二. 线程不安全的现象及原因&#x1f346;1. 修改共享的数据&#xff08;根本原因&#xff09;&#x1f345;2. 原子性&am…

class_14:继承

C继承有点类似于c语言 结构体套用 #include <iostream> #include <string> using namespace std;//基类,父类 class Vehicle{ public:string type;string contry;string color;double price;int numOfWheel;void run();void stop(); };//派生类&#xff0c…

commit 历史版本记录修正

commit 历史版本记录修正 当 Bug 发生的时候&#xff0c;我们会需要去追踪特定 bug 的历史记录&#xff0c;以查出该 bug 真正发生的原因&#xff0c;这个时候就是版本控制带来最大价值的时候。 因此&#xff0c;要怎样维持一个好的版本记录是非常重要的&#xff0c;下面是一…

Rockchip linux USB 驱动开发

Linux USB 驱动架构 Linux USB 协议栈是一个分层的架构&#xff0c;如下图 5-1 所示&#xff0c;左边是 USB Device 驱动&#xff0c;右边是 USB Host 驱动&#xff0c;最底层是 Rockchip 系列芯片不同 USB 控制器和 PHY 的驱动。 Linux USB 驱动架构 USB PHY 驱动开发 USB 2…

手机也能随时随地玩红警啦!

还在为找不到红警安装包苦恼吗&#xff1f; 现在可以随时随地&#xff0c;无论手机、ipad、电脑都可以无需安装包在线玩红警啦&#xff01;&#xff01; 不仅能本地单机玩耍&#xff0c;还能联网玩耍&#xff08;可以和老外一起玩哦&#xff5e;&#xff09; 具体在线链接可…

算法第二十一天-丑数

丑数 题目要求 解题思路 首先判断数字是不是为0或者负数&#xff0c;两者均不可能成为丑数&#xff1b; 之后对n进行不断整除&#xff0c;直到无法除尽为止。 简单判断最后的数是不是1即可。 代码 class Solution:def isUgly(self, n: int) -> bool:if n<0:return Fa…

Linux启动流程梳理值得收藏

Linux启动流程总的来说可以分成三个阶段 Linux启动流程图 第一步&#xff1a;上电 在 x86 系统中&#xff0c;将 1M 空间最上面的 0xF0000 到 0xFFFFF 这 64K 映射给 ROM。 当电脑刚加电的时候&#xff0c;会做一些重置的工作&#xff0c;将 CS 设置为 0xFFFF&#xff0c;将 IP…