【系统调用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 1024

int 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 1024

int 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,有缓冲区,并未立即输出。

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

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

相关文章

链表|数据结构|C语言深入学习

什么是链表 离散&#xff0c;就是“分离的、散开的” 链表是什么样子的&#xff1a; 有限个节点离散分配 彼此间通过指针相连 除了首尾节点&#xff0c;每个节点都只有一个前驱节点和一个后继节点 首节点没有前驱结点&#xff0c;尾节点没有后继节点 基本概念术语&#xf…

2023年12月青少年机器人技术等级考试(二级)理论综合试卷

2023年12月青少年机器人技术等级考试&#xff08;二级&#xff09;理论综合试卷 选择题 第 1 题 单选题 下图中&#xff0c;能够将圆周运动转化为往复摆动的是&#xff1f;&#xff08; &#xff09; A. B. C. D. 第 2 题 单选题 如图&#xff0c;该机械结构可实现的运动…

idea远程服务调试

1. 配置idea远程服务调试 这里以 idea 新 ui 为例&#xff0c;首先点击上面的 debug 旁边的三个小圆点&#xff0c;然后在弹出的框框中选择 “Edit”&#xff0c;如下图所示。 然后进入到打开的界面后&#xff0c;点击左上角的 “” 进行添加&#xff0c;找到 “Remote JVM De…

HTML 入门手册(二)

目录 10-表单 11-input标签 11.1文本框 (text) 11.2密码框 (password) 11.3单选按钮 (radio) 11.4复选框 (checkbox) 11.5普通按钮 11.6提交按钮 (submit) 11.7重置按钮 (reset) 11.8隐藏域 (hidden) 11.9文件上传 (file) 11.10数字输入 (number) 11.11日期输入 (…

有效网络安全意识的正确策略

员工在保护组织资产方面发挥着重要作用。随着威胁形势的不断变化&#xff0c;网络安全意识培训是创建良好安全文化的重要组成部分。 为什么要进行网络安全意识培训&#xff1f; 2022 年&#xff0c; 81% 的组织遭受恶意软件、网络钓鱼和密码攻击&#xff0c;主要针对用户。 …

SpringBoot 异常报告器解析

介绍 SpringBootExceptionReporter用于捕获和处理启动期间的异常&#xff0c;例如应用程序上下文的初始化失败。我们业务中的异常处理一般使用拦截器进行拦截处理业务异常。 异常报告流程解析 框架内实现 reportException实现 FailureAnalyzer介绍 analyze逻辑 FailureAnalys…

数据结构·顺序表应用

本节应用是要用顺序表实现一个通讯录&#xff0c;收录联系人的姓名、性别、电话号码、住址、年龄 ​​​​​​​ 顺序表的实现在上一节中已经完成了&#xff0c;本节的任务其实就是应用上节写出来的代码的那些接口函数功能&#xff0c;做出来一个好看的&#xff0c;可…

1.电子基础

https://www.falstad.com/circuit/circuitjs.html vcc&#xff1a;正极 三角形&#xff1a;负极 理想电路原件 电压源、电流源 电压源&#xff1a;正负号表示电压方向 电流源&#xff1a;箭头表示电流方向

2024PMP考试新考纲-【过程领域】近期典型真题和很详细解析(9)

华研荟继续为您分享【过程Process领域】的新考纲下的真题&#xff0c;帮助大家体会和理解新考纲下PMP的考试特点和如何应用所学的知识和常识&#xff08;经验&#xff09;来解题&#xff0c;并且举一反三&#xff0c;一次性3A通过2024年PMP考试。 2024年PMP考试新考纲-【过程领…

Drivable 3D Gaussian Avatars 论文笔记

Drivable 3D Gaussian Avatars 论文笔记 主要的算法架构和贡献是什么&#xff1f;如何使用这个deformation 呢&#xff1f; 主要的算法架构和贡献是什么&#xff1f; 这篇文章主要使用了两个当前流行的概念&#xff0c;一是3D高斯溅射&#xff0c;二是cage-based deformation。…

java SSM政府采购管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM政府采购管理系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代 码和数据库&#xff0c;系统主要采…

DC-7靶机做题记录

靶机下载地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1w2c_QKd_hOoR2AzNrdZjMg?pwdtdky 提取码&#xff1a;tdky 参考&#xff1a; DC7靶机地址&#xff1a;http://www.five86.com/downloads/DC-7.zipDC7靶场介绍: https://www.vulnhub.com/entry/dc-7,356/…

Matlab/simulink风储调频,多台飞轮储能调频,风电场调频,飞轮储能带有虚拟惯量和下垂控制,三机九节点系统一次调频,离散模型

上述为不同飞轮储能容量配比&#xff0c;风电场容量配比&#xff0c;以及有无附加频率控制的飞轮储能出力分析。 飞轮储能驱动电机为永磁同步机电机PMSG 有无飞轮储能容量较小&#xff0c;所以对频率的改善效果有限&#xff0c;不过可以继续增大容量&#xff0c;从而增大频率的…

数据结构之顺序表的增删查改

别丢了你的勇敢 前言&#xff1a; 自今日起&#xff0c;我们正式越过C语言的大山&#xff0c;走向了数据结构的深山&#xff0c;现如今摆在我们面前的第一个坎就是顺序表&#xff0c;我们需要了解顺序表的定义&#xff0c;并且知道&#xff0c;如何对其进行增删查改&#xff0…

unicloud 云对象 schema

目录 云对象 创建云对象 客户端调用 二、Schema&#xff08;表结构&#xff09; 什么是Schema&#xff1f; 如何编写DB Schema Schema的一级节点 客户端直连数据库 字段属性 字段类型bsonType 默认值defaultValue/forceDefaultValue 云对象 创建云对象 云对象&#…

智能算法 | Matlab实现改进黑猩猩优化算法SLWCHOA与多个基准函数对比与秩和检验

智能算法 | Matlab实现改进黑猩猩优化算法SLWCHOA与多个基准函数对比与秩和检验 目录 智能算法 | Matlab实现改进黑猩猩优化算法SLWCHOA与多个基准函数对比与秩和检验预测效果基本描述程序设计参考资料 预测效果 基本描述 1.Matlab实现改进黑猩猩优化算法SLWCHOA与多个基准函数…

mqtt连接阿里云

参考文章&#xff1a;https://blog.csdn.net/fang_dz999/article/details/112283742?app_version6.2.5&codeapp_1562916241&csdn_share_tail%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22112283742%22%2C%22source%22%3A%22mantouyouy…

JAVA中TreeSet集合的两种排序方法:自然排序和比较器排序

TreeSet支持2种排序&#xff1a;自然排序、比较器排序。 由于TreeSet对内部元素的排序的方法有2种&#xff1a;自然顺序排序、比较器排序。 所以&#xff0c;如果TreeSet采用自然顺序排序&#xff0c;需要内部的元素&#xff08;即自定义类型&#xff09;实现Comparable接口。…

前后对比效果展示的视频怎么制作?左右对比PR模板 Before and After v.2

10种表现方式&#xff0c;前后对比效果展示视频制作PR模板 Before and After v.2 如果您想比较两个图像或视频&#xff0c;这个Adobe Premiere Pro模板非常适合您。只需将两个文件拖放到媒体中&#xff0c;就可以开始了。 适合PS处理图片后期修图前后对比&#xff0c;AI绘图效果…

企业Oracle1 数据库管理

Oracle的安装 一、基础表的创建 1.1 切换到scott用户 用sys 账户 登录 解锁scott账户 alter user scott account unlock;conn scott/tiger;发现并不存在scott账户&#xff0c;自己创建一个&#xff1f; 查找资料后发现&#xff0c;scott用户的脚本需要自己执行一下 C:\ap…