Linux 文件系统调用 文件操作

2023-05-16

Linux 文件系统调用 文件操作

    • Linux 文件系统调用 文件操作:
      • 1
      • 2
        • 将a.txt 内容拷贝到 b.txt:(cp命令实现 mycp命令)
        • 找文件
        • int fd = open(); + fork
          • **先open 再fork()**
          • PCB
          • **先fork() 再open**
        • 额外:

Linux 文件系统调用 文件操作:

1

在Linux 中文件都以 二进制形式

文件操作:

windows:

c库函数: fopen fead fwrite fclose fseek

路径+文件名 模式

Linux中:路径+文件名 模式 权限

操作硬件需要 内核函数,内核态

文件操作头文件: #include<fcntl.h>

man open

O_APPEND:是一个原子操作,移动到末端,写数据。

#include<stdio.h>
#include<fcntl.h>//系统调用的 文件操作
#include<stdlib.h>
#include<unistd.h>

int main()
{
    open("./a.txt",O_WRONLY);
    //在当前路径下打开a.txt  权限为 只读:O_WRONLY     
    //如果不存在a.txt 不会创建a.txt 直接返回失败
   
    open("./a.txt",O_WRONLY | O_CREAT,0600);  
    //如果 |上 O_CREAT就可以创建a.txt 并给上0600 权限
    
    open("./a.txt",O_WRONLY | O_REONLY | O_CREAT,0600); 
    //可读 可写 不存在可创建
    
    
    //fd 文件描述符 一个fd对应一个文件,文件关闭后,文件描述符归还给操作系统 fd>=0
    //fd ==-1 文件打开失败	
    
    //标准输入stdin 0		标准输出stdout 1	标准错误stderr 2
    
    close(fd);//关闭文件
    exit(0);
}





2

#include<stdio.h>
#include<fcntl.h>//系统调用的 文件操作
#include<stdlib.h>
#include<unistd.h>

int main()
{
    int fd =  open("./a.txt",O_WRONLY |O_APPEND| O_CREAT,0600);  
    
    
    open("./a.txt",O_WRONLY);
    //在当前路径下打开a.txt  权限为 只读:O_WRONLY     
    //如果不存在a.txt 不会创建a.txt 直接返回失败
   
    open("./a.txt",O_WRONLY | O_CREAT,0600);  
    //如果 |上 O_CREAT就可以创建a.txt 并给上0600 权限
    
   // open("./a.txt",O_WRONLY | O_REONLY | O_CREAT,0600); 
    //可读 可写 不存在可创建
    
    
     fd 文件描述符 一个fd对应一个文件,文件关闭后,文件描述符归还给操作系统 fd>=0
    //fd ==-1 文件打开失败	
    
    //标准输入stdin 0		标准输出stdout 1	标准错误stderr 2
    
    close(fd);//关闭文件
    exit(0);
}

将a.txt 内容拷贝到 b.txt:(cp命令实现 mycp命令)

#include<stdio.h>
#include<fcntl.h>//系统调用的 文件操作
#include<stdlib.h>
#include<unistd.h>
#include<assert.h>

//将a.txt 拷贝到 b.txt

int main()
{
    char*s_name = "a.txt";
    char*new_name = "b.txt";
    int fdr = open(s_name,O_RDONLY);//文件存在
    assert(fdr!=-1);
    int fdw = open(new_name,O_WRONLY|O_CREAT,0600);//不存在,要创文件
    assert(fdw!=-1);
    
    //依次读取a.txt 写入 b.txt 大文件
    char buff[128] = {0};
    int num = 0;
    while( (num=read(fdr,buff,128)) >0)// 注意: > 优先级大于 =
    {
        //num == 0 读取完成
        write(fdw,buff,num);
    }
    close(fdr);
    close(fdw);
    exit(0);
    
}

找文件

find 大体路径 -name “文件名”

例:sudo find /etc/ -name “passwd”

在这里插入图片描述

//fd 文件描述符 一个fd对应一个文件,文件关闭后,文件描述符归还给操作系统 fd>=0

int fd = open(); + fork

先open 再fork()
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<fcntl.h>
#include<assert.h>

int main()
{
    int fd = open("a.txt",O_RDONLY);//abcde
    assert(fd!=-1);
    pid_t pid = fork();
    if(pid == 0)
    {
        char buff[10]={0};
        read(fd,buff,1);
        printf("son:buff=%s\n",buff);
        sleep(1);
        read(fd,buff,1);
        printf("son:buff=%s\n",buff);
    }
    else
    {
        char buff[10]={0};
        read(fd,buff,1);
        printf("father:buff=%s\n",buff);
        sleep(1);
        read(fd,buff,1);
        printf("father:buff=%s\n",buff);
        
    }
    close(fd);
    exit(0);
    
    
}

结果:abcd

son:a father:b son:c father:d

PCB

**文件表:**存储在PCB

0 stdin

1 stdout

2 stderr

3 a.txt (struct file)

struct file:

打开方式

计数器(全局变量):几处地方引用a.txt

inode 节点号 (通过ls -i查看):节点唯一标识哪个文件 —>指a.txt

文件偏移量:pos=0

. . . . . .

使用fork()后 父子进程共同读取文件,每读一个,记录文件的结构体中的文件偏移量 +1 ,故不会将a 读两次。

close(fd); 一次计数器-1 计数器==0时 回收相关的信息

在这里插入图片描述

先open 再fork() a.txt 只打开了一次 close(fd)只管一次

先fork() 再open
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<fcntl.h>
#include<assert.h>

int main()
{
    pid_t pid = fork();
    assert(pid!=-1);
    int fd = open("a.txt",O_RDONLY);//abcde
    assert(fd!=-1);
   
    if(pid == 0)
    {
        char buff[10]={0};
        read(fd,buff,1);
        printf("son:buff=%s\n",buff);
        sleep(1);
        read(fd,buff,1);
        printf("son:buff=%s\n",buff);
    }
    else
    {
        char buff[10]={0};
        read(fd,buff,1);
        printf("father:buff=%s\n",buff);
        sleep(1);
        read(fd,buff,1);
        printf("father:buff=%s\n",buff);
        
    }
    close(fd);
    exit(0);
    
    
}

结果:abcd

son:a father:a son:b father:b

在这里插入图片描述

close(fd); 父子进程都要执行

额外:

printf(“a\n”);//放在缓冲区,\n刷新到屏幕上

printf();通过调用write 系统调用函数,为用户态->内核态切换过程

printf(“a\n”); == write(1,“a”,1);//write(1,“hello”,5); 直接将数据输入到屏幕,不经过缓冲区

int main()
{
    printf("A");
    write(1,"B",1);
    fork();
    exit(0);//此时刷新缓冲区
}
结果:BAA
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux 文件系统调用 文件操作 的相关文章

  • 即使退出命令后,Shell 脚本仍继续运行

    我的shell脚本如下所示 bin bash Make sure only root can run our script EUID ne 0 echo This script must be run as root 1 gt 2 exit
  • 在大型文本文件中查找重复记录

    我在一台 Linux 机器 Redhat 上 并且有一个 11GB 的文本文件 文本文件中的每一行包含单个记录的数据 并且该行的前 n 个字符包含该记录的唯一标识符 该文件包含略多于 2700 万条记录 我需要验证文件中不存在具有相同唯一标
  • “排序文件名 | uniq”不适用于大文件

    我可以从小文本文件中删除重复条目 但不能从大文本文件中删除重复条目 我有一个 4MB 的文件 文件的开头如下所示 aa aah aahed aahed aahing aahing aahs aahs aal aalii aalii aali
  • PHP exec - 检查是否启用或禁用

    有没有办法检查 php 脚本是否exec 在服务器上启用还是禁用 这将检查该功能是否确实有效 权限 权利等 if exec echo EXEC EXEC echo exec works
  • 如果specfile中的某些条件不满足,如何中止rpm包的安装?

    还有一些事情Requires标签不满足 所以我写了一个脚本来验证这些东西 但是我把它们放在哪里呢 如果没有找到 那么我想退出安装 提示用户在尝试再次安装此 rpm 之前执行这些步骤 writing exit 1 in installtag
  • 安装 Pillow 错误:安装脚本退出并出现错误:命令“x86_64-linux-gnu-gcc”失败,退出状态为 1

    当我尝试安装 Pillow 2 5 3 时 我收到错误 命令 x86 64 linux gnu gcc 失败 退出状态为 1 这是所发生事件的完整日志 http pastebin com 5k2TsyJY 我需要这个库作为另一个 pytho
  • Azure Nvidia 中的 apt-update 出现公钥错误

    我在 AZURE 上启动了 NVIDIA VM 并尝试使用进行更新sudo apt update但给出错误 Hit 2 http azure archive ubuntu com ubuntu focal InRelease Hit 3 h
  • 查找系统日志最大消息长度

    大多数 Unix 程序员都会习惯由syslog h 并且许多实现 例如 glibc 对发送给它的 syslog 消息的大小没有真正的限制 但通常对侦听的应用程序有限制 dev log 我想知道是否有人知道如何找到系统日志的最大消息大小 或者
  • 是否可以允许jenkins访问只有root或某些特定程序可以访问的文件?

    我基本上想做的是允许 jenkins 访问我的 android sdk linux 文件夹和所有子目录 我的老板不想自己更改文件夹的权限 我应该在构建过程中这样做 我见过一些在构建过程中在执行 shell 中运行一些命令的示例 是否可以在该
  • 如何永久清除 linux/ubuntu 终端或 bash 中的所有历史记录? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 当您在 Linux 终端中使用向上键时 可以再次使用之前的命令 很棒的功能 但是 我开始使用命令中的敏感详细信息将 mysql 记录到 mysql 中
  • Linux 中不使用 C++ 的 C 异常处理

    Linux 是否提供了 C 语言的异常处理而不求助于 C 或者 实现此类异常处理的最佳方法是什么 目标是避免检查每个调用的函数的返回码 而是执行类似于 C 的线程安全且易于移植的操作 您可以通过为其编写信号处理程序来处理信号 GNU 记录的
  • 使用 perf 查找线程瓶颈并优化挂机时间

    对 cpu 周期进行采样perf record如果核心利用率大致恒定 则对于寻找优化候选非常有用 但对于具有并行性不同的多个阶段的代码 计算 cpu 周期将重点强调并行阶段 而低估影响挂机时间的顺序或有限并行阶段 简而言之 天真的 perf
  • 找出某个日期时间自unix纪元以来的时间?

    我想找出 2009 年 10 月 1 日 9 00 BST 的 UNIX 时间 即自 Unix 纪元以来的秒数 我如何在 Linux 命令行上执行此操作 我知道你可以使用date UNIXTIME someformat 但是unix时间是我
  • 更改 Amazon RDS MYSQL Linux 服务器的 innodb_log_file_size 变量值

    我们正在使用 Amazon RDS linux 服务器作为 MYSQL 更改 my cnf 文件变量值的方法是什么 我正在尝试更改 innodb log file size 变量 您能告诉我哪一个是最好的改变方式吗 所以请帮我解决这个问题
  • 在 UNIX 时间戳 Shell/Bash 中将日期与时区转换

    我需要将日期从格式为 yyyy mm dd hh mm ss TZ 的字符串转换为 UNIX 时间 TZ 时区 到目前为止我所做的是将没有时区的 yyyy mm dd hh mm ss 格式的日期转换为时间戳 dateYMD 2019 2
  • 从 bash 脚本返回值

    我想创建一个返回值的 Bash 文件 意思是 在脚本 script a bash 中我有一定的计算 脚本 script b bash 会调用它 script a bash return 1 5 script b bash a value s
  • 使用正在运行的进程的共享内存收集核心转储

    核心转储仅收集进程空间 而不收集为进程间通信创建的共享内存 如何使核心转储也包含正在运行的进程的共享内存 设置核心文件过滤器 proc PID coredump filter per http man7 org linux man page
  • 什么是接口标识符

    我有一台笔记本电脑 使用一个或多个网络适配器连接到我组织的网络 我正在尝试编写一个工具来持续监控每个网络的连接状态和连接质量 然而 我的网络知识有限 术语让我感到困惑 特别是查找所有网络适配器 有人建议我使用命令ifconfig它给了我所谓
  • Linux 的 gcc __attribute__((selectany)) 替代方案?

    我想知道是否有替代方案 attribute selectany 在Linux中 我想定义这样的东西 char a qwe zxc 并将其包含在许多链接在一起的 c 文件中 因此链接器将看到 a 的多个定义 因此不会链接 我读过这个属性 se
  • 从汇编程序获取命令行参数

    通读 专业汇编语言书籍 似乎它提供了用于读取命令行参数的错误代码 我纠正了一点 现在它从段错误变成了读取参数计数 然后是段错误 这是完整的代码 data output1 asciz There are d params n output2

随机推荐

  • [NOI2018] 归程

    关于spfa 他死了 问题可以转化成 xff0c 我们在所有海拔 gt p gt p gt p 的边组成的图中 xff0c v v
  • Vue.js 3 ssr 中报错Hydration node mismatch: - Client vnode: div - Server rendered DOM:已解决

    使用nuxt框架 43 element 43 vue3 出现该问题 解决方案 该问题其实是由于在开发阶段本地服务器的代码与浏览器的代码不一致导致的问题 xff0c 可以执行一次build命令 xff0c 可以解决该问题 xff0c 实际到部
  • egg js 搭建项目,教程

    Egg js 搭建工程 Egg js 为企业级框架和应用而生 xff0c 我们希望由 Egg js 孕育出更多上层框架 xff0c 帮助开发团队和开发人员降低开发和维护成本 官网 使用脚手架搭建应用程序 快速初始化项目 npm init e
  • k8s1.26安装(kubeadm containerd)

    环境背景 xff1a k8s 1 k8s 2 k8s3三台主机 1台master节点 xff0c 2台node节点 准备环境 修改主机名 3台分别修改主机名 hostnamectl set hostname k8s 1 hostnamect
  • 自动化运维必备之Shell脚本的循环语句,超详细讲解!

    Shell编程之循环语句 自动化运维必备之Shell脚本的循环语句 xff0c 超详细讲解 xff01 Shell编程之循环语句前言1 for循环3 while循环和until循环4 嵌套循环5 循环语句中的break exit和conti
  • 洛谷P2078 朋友

    题目传送门 xff1a 洛谷P2078 朋友 题目详情 xff1a 小明在 A 公司工作 xff0c 小红在 B 公司工作 这两个公司的员工有一个特点 xff1a 一个公司的员工都是同性 A 公司有 N 名员工 xff0c 其中有 P 对朋
  • Ubuntu-18.04版本网络配置,连接网络的方法

    运行命令 sudo apt get update 时出错 xff1a 好久没有Ubuntu xff0c 本来想安装一个工具 xff0c 结果一顿操作后 xff0c 发现网没连上 后来查了资料 xff0c 才解决 1 查看网络状态 xff0c
  • Windows系统安装配置MinGw64位详细教程

    MinGW 全称为 xff0c Minimalist GNU for Windows xff0c 它实际上是将经典的开源 C语言编译器 GCC 移植到了 Windows 平台下 xff0c 并且包含了 Win32API xff0c 因此可以
  • 如何学习正则表达式

    正则基础知识点 1 元字符 万物皆有缘 xff0c 正则也是如此 xff0c 元字符是构造正则表达式的一种基本元素 我们先来记几个常用的元字符 xff1a 元字符说明 匹配除换行符以外的人一字符 w匹配字母或数字或下划线或汉字 s匹配任意的
  • css布局入门指南,掌握页面布局基础

    大前端入门到精通 专栏正在持续更新中 案例的原理图解析 各种模块分析 这里都有哦 同时也欢迎大家订阅专栏 获取更多详细信息哦 个人主页 零小唬的博客主页 欢迎大家 点赞 评论 收藏 作者简介 20级计算机专业学生一枚 来自宁夏 可能会去做大
  • 运用CSS视觉差和精灵图优化网页性能案例

    大前端入门到精通 专栏正在持续更新中 案例的原理图解析 各种模块分析 这里都有哦 同时也欢迎大家订阅专栏 获取更多详细信息哦 个人主页 零小唬的博客主页 欢迎大家 点赞 评论 收藏 作者简介 20级计算机专业学生一枚 来自宁夏 可能会去做大
  • [CSP2019] 划分

    link 32pts 用 f i j f i j f i j
  • CSS基本语法入门,掌握几种常见的选择器

    大前端入门到精通 专栏正在持续更新中 案例的原理图解析 各种模块分析 这里都有哦 同时也欢迎大家订阅专栏 获取更多详细信息哦 个人主页 零小唬的博客主页 欢迎大家 点赞 评论 收藏 作者简介 20级计算机专业学生一枚 来自宁夏 可能会去做大
  • 深入理解css复杂选择器的应用:解密多层标签嵌套的最佳案例

    大前端入门到精通 专栏正在持续更新中 案例的原理图解析 各种模块分析 这里都有哦 同时也欢迎大家订阅专栏 获取更多详细信息哦 个人主页 零小唬的博客主页 欢迎大家 点赞 评论 收藏 作者简介 20级计算机专业学生一枚 来自宁夏 可能会去做大
  • Android Studio:Intent与组件通信实现页面跳转功能

    x1f4cc Android Studio 专栏正在持续更新中 xff0c 案例的原理图解析 各种模块分析 x1f496 这里都有哦 xff0c 同时也欢迎大家订阅专栏 xff0c 获取更多详细信息哦 个人主页 xff1a 零小唬的博客主页
  • Linux 文件系统调用 文件操作

    Linux 文件系统调用 文件操作 Linux 文件系统调用 文件操作 xff1a 12将a txt 内容拷贝到 b txt xff1a xff08 cp命令实现 mycp命令 xff09 找文件int fd 61 open 43 fork
  • 【C语言】辗转相除法

    当我们初学C语言时 xff0c 遇到一个需要我们求出这两个数字的最大公约数的题目 xff0c 这时我们应该如何去设计代码来完成目的呢 xff1f 公约数是什么 xff1f 这个首先我们需要清楚 它是指能够同时整除几个整数的数 xff0c 在
  • 【开篇】STM32F103C8T6 含义、命名规则、GPIO原理以及初始化(参考男神江科协,学习交流用)

    目录 目录 一 xff0c STM系列命名规则 二 引脚功能 三 电路以及寄存器 一 xff0c STM系列命名规则 1 产品系列 xff1a STM32代表意法半导体的Cortex Mx系列内核 xff08 ARM xff09 32位的M
  • [NOIO #2] 游戏

    首先有一个结论 二项式反演 用 f n f n f n 表示钦定选择了 n
  • Python的命名规范

    文章目录 一 python变量名命名的硬性规则1 1 变量名大小写敏感1 2 python的变量名字中可以包含英文 下划线 数字 xff0c 但是不能以数字开头 二 不同风格命名的变量代表不同的类型2 1命名法2 2 模块 module 命