Linux | 文件操作的系统调用 open() read() write()

news2024/9/22 7:18:09

1. 基本含义辨析

文件操作的系统调用 open read write close (系统调用:实现在内核中【用户态->内核态】“陷入内核”

man: 1 命令   2 系统调用  3 库函数

C操作文件的库函数 fopen fread fwrite fclose (fopen库函数的执行底层是调用系统调用open();printf()库函数底层是调用write()系统调用实现的)

(1)open()

若文件存在:open() //文件名,打开方式:r,w

若文件不存在:open() //文件名,打开方式:r,w|creat,设置文件权限

(2)write() 

参数:文件描述符(fd)、写入的数据、数据长度。 返回值:实际写入的数据长度。

(3)read()

参数:文件描述符、要读入到的缓冲区、读多少个。  返回值:读到的数据长度。

当read()返回值为0时代表读到文件末尾。(会多读一次,最后一次返回值0代表到达文件末尾)

2. 实际应用

(1)直接使用

 

 (2)实现对任意文件的cp拷贝功能(输入源文件名和目的文件名)

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<fcntl.h>
//read返回值==0~读到末尾

int main(int argc, char* argv[])
{
    if(argc!=3)//argv[0]=./mycp  argv[1]=源文件名  argv[2]=目的文件名
    {
        printf("argc err\n");
        exit(1);
    }
    char *s_name = argv[1];
    char *s_newname=argv[2];
    int fd1=open(s_name,O_RDONLY);
    if(fd1==-1)
    {
        printf("File:%s not exist\n",s_name);
        exit(1);
    }

    int fd2=open(s_newname,O_WRONLY|O_CREAT,0600);
    if(fd2==-1)
    {
        printf("Cerate File:%s error\n", s_newname);
        exit(1);
    }

    char buff[128] = {0};
    int num = 0;
    while ((num=read(fd1,buff,128))>0)
    {
        write(fd2, buff, num);//由于不确定每次读128个,所以每次写入读到的num个
    }

    close(fd1);
    close(fd2);

    exit(0);
}

(3)fork复制文件描述符~共享读同一文件

先open再fork:父子进程共享文件偏移量;先fork后open:文件偏移量不共享。

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<fcntl.h>

int main()
{
    int fd = open("a.txt", O_RDONLY);
    if(fd==-1)
    {
        printf("open file error\n");
        exit(1);
    }
    
    //fork
    pid_t pid = fork();
    if(pid==-1)
    {
        printf("fork error\n");
        exit(1);
    }
    if(pid==0)//child  先open再fork:父子进程共享文件偏移量;先fork后open:文件偏移量不共享
    {
        char buff[32] = {0};
        read(fd, buff, 1);
        printf("child buff=%s\n", buff);
        sleep(1);
        read(fd, buff, 1);
        printf("child buff=%s\n", buff);
    }
    else//parent
    {
        char buff[32] = {0};
        read(fd, buff, 1);
        printf("parent buff=%s\n", buff);
        sleep(1);
        read(fd, buff, 1);
        printf("parent buff=%s\n", buff);
    }
    close(fd);
    exit(0);
}

对于a.txt(内容为abcdefg),运行结果为:

 3. 任何一个进程开启运行,便会自动打开三个文件。

(1)stdin 标准输入 FILE*  文件描述符fd=0

(2)stdout 标准输出 FILE*  文件描述符fd=1  当printf的打印缓冲区中数据攒够后便由用户态->内核态交给write()处理输出。

(3)stderr 标准错误输出 FILE*  文件描述符fd=2

对于PCB中的内容之一:文件表(实质是结构体)

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

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

相关文章

一个有意思的图片鼠标切换

做淘宝活动页面的时候&#xff0c;用到最多的就是锚点&#xff0c;一个图片标签&#xff0c;然后不断地在上面画热区。不过我想问的是有多少人研究过&#xff0c;用矩形画热点&#xff0c;四个坐标值各自表示的含义&#xff0c;还有它和background-position有什么相同或相似的地…

JavaWeb:RequestResponse的概述

1&#xff0c;Request和Response的概述 Request是请求对象&#xff0c;Response是响应对象。 这两个对象在我们使用Servlet的时候有看到&#xff1a; 此时&#xff0c;我们就需要思考一个问题request和response这两个参数的作用是什么&#xff1f; request&#xff1a;获取请…

RapidUp: Multi-Domain Permutation Protocol for Lookup Tables学习笔记

1. 引言 前序博客有&#xff1a; PLOOKUPPLOOKUP代码解析Efficient polynomial commitment schemes for multiple points and polynomials学习笔记PLONK PLOOKUPPlonKup: Reconciling PlonK with plookupPLONK: permutations over lagrange-bases for oecumenical nonintera…

2022年就要过去了,我的这份成绩单请您查收……

喜迎元旦岁月不居&#xff0c;时节如流年关交迭在即在2022行将尾声的此时想静静地坐下片刻和关注了云和恩墨这么久的老朋友们细数一遍这光阴里的纷纷呈呈这一年&#xff0c;充满了挑战与艰辛但所有努力和守望终有结果收成这一年&#xff0c;我们全心投入产品研发收获了更多的荣…

【隔离器使用说明】光隔、磁隔、容隔三兄弟介绍

文章目录前言一、三种常用隔离技术1. 光隔离2. 变压器隔离/磁隔3. 电容隔离二、隔离器重要指标1. 隔离电压值2. 爬电距离3. 共模瞬变抗扰度CMTI三、隔离器性能对比总结前言 本文简单介绍常用隔离器的类型和特点&#xff0c;是根据网络知识整理出来的 有错误的话请一定评论留言…

谈谈SpringBoot

1. Spring Boot 简介 简化Spring应用开发的一个框架&#xff1b; 整个Spring技术栈的一个大整合&#xff1b; J2EE开发的一站式解决方案&#xff1b; 2. HelloWorld 功能&#xff1a;浏览器发送hello请求&#xff0c;服务器接受请求并处理&#xff0c;响应Hello World字符串&a…

UE5笔记【十五】漂流者游戏制作【二】雕刻一个峡谷+增加水体

雕刻峡谷 我们希望角色从一个峡谷中开始。 用上一节中&#xff0c;我们配置的Auto图层&#xff0c;雕刻两条山脉&#xff0c;从而雕刻出一条峡谷。然后切换到选择模式下。我们找到PlayStart&#xff0c;然后将其移动到峡谷中&#xff0c; 然后按F切换到角色位置&#xff0c;调…

【C++基础】09:STL(一)

STL&#xff08;一&#xff09; OVERVIEWSTL&#xff08;一&#xff09;一、STL初识1.STL六大组件&#xff1a;2.容器&迭代器&#xff1a;二、STLGroup11.string容器&#xff1a;&#xff08;1&#xff09;基本概念&#xff1a;&#xff08;2&#xff09;string构造函数&am…

前端性能优化(三):代码优化

目录 一&#xff1a;JS开销以及如何缩短解析时间 二&#xff1a;配合V8有效优化代码 2.1.抽象语法树 2.2.V8优化机制 三&#xff1a;函数优化 四&#xff1a;对象优化 4.1.以相同顺序初始化对象成员&#xff0c;避免隐藏类的调整 4.2.实例化后避免添加新属性 4.3.尽量…

数学建模经验分享

今天给大家分享一期关于数学建模比赛的经验分享&#xff0c;我将从以下三个方面展开说明&#xff1a; &#xff08;1&#xff09;如何准备数学建模比赛&#xff1f; &#xff08;2&#xff09;如何选择合适的赛题进行建模&#xff1f; &#xff08;3&#xff09;如何提高获奖…

辉哥带你学hive第三讲

文章目录 1.函数1.1系统内置函数1.2 单行函数1.2.1 算术运算函数1.2.2字符串函数1.2.3 日期函数1.2.4 流程控制函数1.2.5集合函数1.3高级聚合函数1.函数 1.1系统内置函数 1)查看系统自带的函数 hive> show functions; 2)显示自带的函数的用法 hive> desc function up…

机器学习HW10对抗性攻击

机器学习HW10对抗性攻击一、任务描述二、算法1、FGSM2、I-FGSM3、MI-FGSM4、多种输入&#xff08;DIM&#xff09;评估指标三、实验1、Simple Baseline2、Medium Baseline3、Strong Baseline4、Boss Baseline一、任务描述 我们使用pytorchcv来获得CIFAR-10预训练模型&#xff…

STP基础

名词&#xff1a; STP&#xff08;Spanning Tree Protocol&#xff09;生成树协议&#xff1a;运行STP协议的设备通过彼此交互信息发现网络中的环路&#xff0c;并有选择地对某个接口进行阻塞&#xff0c;最终将有环路的网络结构修剪成无环路的树形结构&#xff0c;从而防止报…

ENVI_IDL:对于书写和创建GEOTIFF结构体?

大家在使用WRITE_TIFF函数和READ_TIFF函数的时候&#xff0c;应该遇见过GEOTIFF参数。 但是我对于这个参数却是了解不深&#xff0c;趁着这次学习梳理一下GEOTIFF参数. 在学习之前&#xff0c;我发现IDL教程并没有提供关于GEOTIFF的示例&#xff0c;所以我尝试使用READ_TIFF函…

[Kettle] CSV文件输入

CSV(Comma-Separated Values)文件是以字符(大多数使用逗号,)分隔值&#xff0c;以纯文本形式存储数据的文件 数据源 语文成绩(kettle数据集1).csv https://download.csdn.net/download/Hudas/87356192?spm1001.2014.3001.5501 1.建立【CSV文件输入】转换工程 使用Ctrl N快…

如何将PDF转换为Excel?免费PDF转Excel方法分享

如何免费将PDF转换为Excel 像将文件转换为电子表格这样简单的事情应该不会那么困难。PDF已成为共享文档的标准格式&#xff0c;那么当您需要将PDF作为电子表格时&#xff0c;如何将PDF转换为Excel&#xff1f; 一些网站可以免费将PDF转换为Excel&#xff0c;尽管涉及一些联系…

力扣sql入门篇(五)

力扣sql入门篇(五) 1 组合两个表 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 1.2 示例sql语句 SELECT firstname,lastname,IFNULL(city,null) city,IFNULL(state,null) state FROM Person p LEFT JOIN Address a ON p.personida.personid;1.3 运行截图 2 进店却未…

网络原理3 IP地址

网络原理3 IP地址 文章目录网络原理3 IP地址IP协议的报文格式IP地址的具体规则IP地址的组成子网掩码特殊的IP地址IP地址短缺的解决方法动态分配IP地址NAT机制[主流机制]IPv6路由选择网络层中主要做的事情是在两点之间规划出一个合理的路径&#xff0c;同时也要对主机所处的位置…

CleanMyMac X免费吗?怎么下载2023最新版

CleanMyMac X是一款专业的Mac清理软件&#xff0c;可智能清理mac磁盘垃圾和多余语言安装包&#xff0c;快速释放电脑内存&#xff0c;轻松管理和升级Mac上的应用。同时CleanMyMac X可以强力卸载恶意软件&#xff0c;修复系统漏洞&#xff0c;一键扫描和优化Mac系统&#xff01;…

哈希问题详解

什么是哈希表 在引入哈希表之前&#xff0c;先谈一下为什么要了解哈希表。在学习Set集合时&#xff0c;发现Set集合可以实现无序存储&#xff0c;那么Set是如何实现的无序存储&#xff1f; 打开源码会发现Set集合的底层实际上是由一个map集合实现的。那么什么是哈希表呢&…