【操作文件的系统调用】

news2025/1/16 20:00:55

目录

  • 文件操作系统调用的基本库函数
    • 打开文件
    • 读取文件
    • 写入文件
    • 关闭文件
  • 应用
    • 文件操作代码举例
    • 文件操作与进程复制的结合
      • 先打开文件再复制进程
      • 先进程复制,再进行打开文件
    • 缓冲区的知识回顾

在上一篇讲述僵尸进程的文章中对文件的系统调用做了一点点的代码讲述,这篇文章对操作文件的系统调用进行细节讲述。

文件操作系统调用的基本库函数

打开文件

打开一个已存在的文件:int open(const char* pathname, int flags);
新建一个文件,并设置访问权限:int open(const char* pathname, int flags,mode_t mode);

  • pathname:要打开的文件的路径和文件名
  • flags:打开标志,即:
参数适应情况
O_WRONLY只写打开
O_RDONLY只读打开
O_RDWR读写方式打开
O_CREAT文件不存在则创建
O_APPEND文件末尾追加
O_TRUNC清空文件,重新输入
  • mode:权限(0600读写权限)
  • 返回值:文件描述符(fd)

读取文件

读取文件: ssize_t read(int fd, void* buf, size_t count);

  • fd:对应打开的文件描述符
  • buf:存放数据的容器
  • count:计划一次从文件中读取字节的个数
  • 返回值 :实际读到的字节数

写入文件

写入文件:ssize_t write(int fd, const void* buf,size_t count);

  • fd:对应打开文件的描述符
  • buf:待写入的数据
  • count:计划一次向文件中写入多少数据

关闭文件

关闭文件:int close(int fd)

  • fd:文件描述符

应用

文件操作代码举例

我们通过编写一个自己的拷贝文件来运用一下刚刚库函数
如下代码,将etc下的passwd文件拷贝到当前目录下:

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<fcntl.h>
#include<assert.h>
int main(int argc,char* argv[]){
char* s_name=argv[1];
char* new_name=argv[2];
int fdr=open(s_name,O_RDONLY);
assert(fdr!=-1);
int fdw=open(new_name,O_WRONLY|O_CREAT,0600);
assert(fdw!=-1);
char buff[128]={0};
int num=0;
while(num=read(fdr,buff,128)){
	write(fdw,buff,num);
}
close(fdr);
close(fdw);
return 0;
}

在该文件中用了main函数的参数,main函数参数中argc为参数个数,argv[]为参数内容,因为第一个参数是参数个数本身,所以应用时从第二个参数开始使用,我们在执行main程序时,编译后执行用的是./main命令,可以通过./main后直接加入参数来对参数进行赋值。如下图:在这里插入图片描述
此处要想和cp命令一样使用,只需要将该程序重命名为mycp,然后将编译后的文件移动到/bin路径下即可。(用到的命令:mv ./main.c mycp.c ,gcc -o mtco mycp.c ,sudomv ./mycp /bin)
在这里移动了之后我们如何判断是否移动过去了呢,就需要我们查找这个文件:

  • 查找命令:sudo find /etc/ -name “mycp”
  • 管道过滤:ls /etc | grep “mycp”(这里可以不需要全名,查找需要全名)

文件操作与进程复制的结合

此处我们复习一下僵尸进程:子进程先于父进程结束,且未获取退出码,子进程处于僵死状态。defunct
解决方法:waut,
父进程wait获取子进程退出码,wait(NULL),获取子进程推出码,不用退出码

先打开文件再复制进程

我们看下面程序猜想输出结果是什么?此处b.txt中内容为abcde
在这里插入图片描述
输出结果为:在这里插入图片描述
为什么会这样输出呢,我们要从内存进行分析,看下图在这里插入图片描述
在进程的PCB中有一个文件表,就是上图中带有标号0123的,然后调用文件时,实际上用了文件结构体,结构体图中又展示,结构体中又打开文件当时,计数器,节点号,文件偏移量等变量,因为上代码是先打开文件再进行进程复制,所以拷贝了父进程的PCB(PID不同),把相同的文件表复制了一份,所以操作文件的编号都一样,为此操作就在同一个文件的结构上操作,读取文件时,文件偏移量+1,通过偏移量结点号和偏移量找到输出内容,所以才会导致输出不会刷新,输出abcd。此处也只需要close一次,因为公用一个文件。
在这里插入图片描述

先进程复制,再进行打开文件

如下图,此处底下代码同上,不做展示,求输出结果:
在这里插入图片描述
在这里插入图片描述

因为是先复制进程,再输出,所以此是上图,复制进程时PCB中文件表还没有文件的结构体,所以是不同进程调用了不同的结构体,所以两个进程分开,通过不同的结构体在同一文件中找到输出内容。关闭文件时自然也需要关闭两次,此处的计数器是全局变量,所以要计数器的值为2,子进程父进程各close一次,就会计数器减一,等到计数器等于0时就会文件关闭。

缓冲区的知识回顾

write(1,“B”,1);:直接将数据输出屏幕,不经过缓冲区

int main(){
printf("A");
write(1,"B",1);
fork();
exit(0);
}

输出结果为BAA,此处因为进程复制时复制了缓冲区中的一个A,所以是BAA。

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

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

相关文章

day08 微服务保护

1、JMeter压力测试 1.1、安装启动 JMeter 依赖于JDK&#xff0c;所以必须确保当前计算机上已经安装了 JDK&#xff0c;并且配置了环境变量。 Apache Jmeter官网下载&#xff0c;地址&#xff1a;http://jmeter.apache.org/download_jmeter.cgi 解压缩即可使用&#xff0c;目…

【Acwing—单源最短路:建图】

y总说&#xff0c;图论题的难点不在于打板子&#xff0c;而是建图的过程 个人觉得&#xff0c;建图的过程分成以下阶段&#xff1a; 1.确定结点的意义 2.确定边权的意义 结点一般都很显然&#xff0c;但是边权的意义我们一般把它设成对答案&#xff08;或需要维护的东西&am…

C++入门知识(二)

最近太忙了&#xff0c;发论文写开题&#xff0c;有两周时间没有学习C了&#xff0c;因为都是抽时间来学习&#xff0c;所以本篇博客也是零零散散的&#xff0c;接下来尽量抽时间吧 目录 六、引用 6.1 引用概念 6.2 引用特性 6.3 常引用 6.4 使用场景 6.5 传值、传引用…

并发编程(一)可见性

【并发编程三大特性】&#xff1a; 可见性 有序性 原子性&#xff08; 较复杂 &#xff09; 【线程的可见性】&#xff1a; 【一个例子认识线程的可见性】&#xff1a; import Utils.SleepHelper; import java.io.IOException;public class T01_HelloVolatile {private sta…

Go中的泛型和反射以及序列化

嗨喽,小伙伴们,好几没有更新了,最近在搞一些云原生的东西,docker , k8s 搞得我暂时迷失了方向,不过我举得搞IT吗,就是在不断尝试,搞一下当下最新的技术,不然 … GO中的泛型与继承 搞过java的都知道泛型与继承,在go中也开始搞泛型与继承了(在go1.8之后) 先看代码–>> p…

【记录】PyCharm 安装 preprocess 模块(库)|| 在 PyCharm 中安装 preprocess 失败,故而在 终端 安装

preprocess.py 针对的是处理许多 文件类型。它工作的语言包括&#xff1a;C、Python、 perl、tcl、xml、javascript、css、idl、tex、fortran、php、java、shell 脚本&#xff08;bash、csh等&#xff09;和c。预处理可以作为 命令行应用程序和作为python 模块。 目录一、在 Py…

矩阵论复习提纲

矩阵论复习提纲 第一章 矩阵相似变化 1、特征值与特征向量 A ∈ Cnxn 若存在 λ ∈ C 满足 Ax λx 则 λ 为 A 的特征值 可转换为 &#xff08;λI - A&#xff09;x 0 特征多项式 &#xff1a;det(λI - A) 特征矩阵&#xff1a; λI - A 2、相似对角化 1. 判断可对角化…

VMware Fusion 13 正式版终于来了

千呼万唤&#xff0c;经历两年之久&#xff0c;VMware终于在Fusion 13正式版中支持了Apple Silicon 版Mac&#xff0c;此次发布的Fusion是Universal版本&#xff0c;也就是一个安装包同时适配Intel Mac及Apple Silicon &#xff08;M1&#xff0c;M2&#xff09;Mac。想起我两年…

疑难杂症集合(备忘)

sshd&#xff1a;no hostkeys available 解决过程: #ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key #ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key #/usr/sbin/sshd 如果上述两个文件存在&#xff0c;仍然出现这个错误&#xff0c;那么试试 chmod 600 上述两个文件。之…

01-Python的基本概念

01-Python的基本概念 Python是一种直译式&#xff08;Interpreted&#xff09;、面向对象&#xff08;Object Oriented&#xff09;的程序语言’它拥有完整的函数库’可以协助轻松地完成许多常见的工作。 所谓的直译式语言是指’直译器&#xff08;InteIpretor&#xff09;会将…

诊断故障码(Diagnostic Trouble Code-DTC)

诊断协议那些事儿 诊断协议那些事儿专栏系列文章&#xff0c;本文将由浅入深的介绍DTC&#xff08;Diagnostic Trouble Code&#xff09;。 关联文章&#xff1a; $19服务:DTCStatusMask和statusofDTC bit 定义 19服务List 文章目录诊断协议那些事儿DTC&#xff08;Diagnos…

Python pyenv install 下载安装慢(失败)完美解决

pyenv 下载原理就是将例如 Python-3.10.3.tar.xz 这样的压缩文件下载到本地缓存文件或临时文件&#xff0c;然后解压出来使用。 由于下载速度或者网不行&#xff0c;那么就跳过 pyenv 下载&#xff0c;自己下载&#xff0c;然后放到它的缓存文件&#xff0c;这样不就行了。 1…

3.np.random

1. np.random.seed np.random.seed()函数用于生成指定随机数。 seed()被设置了之后&#xff0c;np.random.random()可以按顺序产生一组固定的数组&#xff0c;如果使用相同的seed()值&#xff0c;则每次生成的随机数都相同。 如果不设置这个值&#xff0c;那么每次生成的随机数…

[附源码]计算机毕业设计JAVA基于Java的护肤品网站

[附源码]计算机毕业设计JAVA基于Java的护肤品网站 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM my…

【MySQL进阶】表的增删改查操作(CRUD)+(SQL执行顺序)

1. 新增(复制数据)2. 查询 - 进阶2.1 聚合查询2.2 group by2.3 having2.4 联合查询2.4.1 内连接2.4.2 外连接2.4.3 自连接2.4.4 子查询2.4.5 合并查询3 SQL的执行顺序(where...)1. 新增(复制数据) 语法 -- 字段名 列名 -- 将表2的数据复制到表1中 -- 两张表的结构要一样 i…

前端知识点

1.HTML 2.CSS 3.js 4.VUE 5.vUE的基本指令 6.VUE案例 7.ELEMENT HTML 设置图片 <img src"图片地址">让图片居中显示<center><img src"图片地址" width"270" height"900"></center>有序列表 <!--有序 ty…

Spring框架技术的核心与设计思想

目录 1. Spring 是什么? 1.1 什么是容器? 1.2 什么是 IoC ? 2. 传统式开发 3. 控制(权)反转式开发 4. 理解Spring 核心 - IoC 1. Spring 是什么? Spring 的全称是 Spring Framework, 它是一种开源框架, 2002 年, Rod Jahnson 首次推出了 Spring 框雏形 interface21…

[UE笔记]客户端服务器时间同步

内容系看教程所做的笔记 时间 往返时间&#xff08;RTT, Round-Trip Time&#xff09;&#xff1a;数据从客户端通过网络发送到服务器&#xff0c;再从服务器返回到客户端所需的时间。 首先客户端应当知道服务端的当前时间。 服务器启动时间总是先于客户端的&#xff0c;客户…

【学习OpenCV4】OpenCV入门精讲(C++/Python双语教学)

大家好&#xff0c;我在CSDN开的OpenCV课程已经开课了&#xff0c;入口如下&#xff1a; OpenCV入门精讲&#xff08;C/Python双语教学&#xff09; 课程开始快一周了&#xff0c;收到了广大同学们的欢迎。 &#xff08;1&#xff09;评分很高&#xff1b; &#xff08;2&#…

从Clickhouse 到 Snowflake: 云原生

云原生Clickhouse优势概述 以Clickhouse为基础&#xff0c;借鉴Snowflake等系统的设计思路&#xff0c;打造一款高性能的云原生OLAP系统&#xff0c;为用户提供多场景下的一站式的数据分析平台。 简单、易维护&#xff1a;集群管理、统一共享分布式调度服务高可用、可扩展&am…