现在,假设 hello.txt 是硬盘上已有的一个文件,而且内容为 “hello, world” ,在文件的当前指针设置完毕后,我们来介绍 sys_read , sys_write , sys_lseek 如何联合使用才能把数据插入到 hello.txt 中。

可以通过如下方式对它们进行组合应用,应用程序的代码如下: 

#include <fcntl.h>
#include <stdio.h>
#include <string.h>#define LOCATION 6int main(char argc, char **argv)
{char str1[] = "Linux";char str2[1024];int fd, size;memset(str2, 0, sizeof(str2));fd = open("hello.txt", O_RDWR, 0644);lseek(fd, LOCATION, SEEK_SET);strcpy(str2, str1);size = read(fd, str2+5, 6);lseek(fd, LOCATION, SEEK_SET);size = write(fd, str2, strlen(str2));close(fd);return (0);
}

这是一段用户进程的程序,通过这样一段代码就能将 “Linux” 这个字符串插入到 hello.txt 文件中了,最终 hello.txt 文件中的内容应该是 : “hello,Linuxworld” 。

这段代码几乎用到了操作文本文件的所有系统调用,下下面我们来分析一下这些代码的作用。

fd = open("hello.txt", O_RDWR, 0644);

open 函数将对应sys_open 函数,很明显,在操作之前先要确定要操作哪个文件。

lseek(fd, LOCATION, SEEK_SET);

lseek 函数将对应 sys_lseek 函数,由于参数中选择了 SEEK_SET ,表明要将文件的当前操作指针从文件的起始位置向文件尾端偏移6个字节。

strcpy(str2, str1);

这一行是将 “Linux” 这个字符串拷贝到 str2[1024] 这个数组的起始位置处。

size = read(fd, str2+5, 6);

这一行实现的拼接,拼接的结果是: Linuxworld

lseek(fd, LOCATION, SEEK_SET);

这行的效果和前面调用的效果一样,都是要讲文件的当前操作指针,即文件的起始位置,向文件尾端偏移6个字节,这个时候就确定了下面文件的准确写入位置。

size = write(fd, str2, strlen(str2));

write 函数将对应 sys_write 函数,现在要讲 str2 这个数组中的 “Linuxworld” 字符串写入到 hello.txt 文件中,而且写入位置刚刚确定,就是从文件的起始位置向尾端偏移六个字节的位置,于是最终的写入结果就是 : “hello,Linuxworld”


以上所述,就是 read, write, lseek 组合应用,从而实现文件修改的全过程。

Linux0.11中对文本文件进行修改的策略相关推荐

  1. 对Linux0.11 中 进程0 和 进程1分析

    1. 背景 进程的创建过程无疑是最重要的操作系统处理过程之一,很多书和教材上说的最多的还是一些原理的部分,忽略了很多细节.比如,子进程复制父进程所拥有的资源,或者子进程和父进程共享相同的物理页面,拥有 ...

  2. 在Linux-0.11中实现基于内核栈切换的进程切换

    原有的基于TSS的任务切换的不足 进程切换的六段论 1 中断进入内核 2 找到当前进程的PCB和新进程的PCB 3 完成PCB的切换 4 根据PCB完成内核栈的切换 5 切换运行资源LDT 6 利用I ...

  3. linux睡眠当前进程,linux-0.11中进程睡眠函数sleep_on()解析

    sleep_on()用于进程睡眠. 其原型为 void sleep_on(struct task_struct **p); 比如某个资源是互斥的,当资源被某一个进程占用时,其他进程便无法访问此资源. ...

  4. Linux0.11 中对地址的管理

    逻辑地址(Logical Address) 是指由程序产生的与段相关的偏移地址部分.例如,你在进行C语言指针编程中,可以读取指针变量本身值(&操作),实际上这个值就是逻辑地址,它是相对于你当前 ...

  5. Linux0.11系统调用之execve流程解析

    Linux0.11系统调用之execve流程解析 前言 execve功能介绍 execve本质 execve系统调用流程 总结 前言 本文是基于Linux0.11源码来叙述该功能,源码可以在oldli ...

  6. linux0.11—内存管理实验

    实验基本内容 用 Bochs 调试工具跟踪 Linux 0.11 的地址翻译(地址映射)过程,了解 IA-32 和 Linux 0.11 的内存管理机制: 在 Ubuntu 上编写多进程的生产者-消费 ...

  7. Linux0.11操作系统(哈工大李治军老师)实验楼实验1-引导

    Linux0.11操作系统(哈工大李治军老师)实验楼实验1-引导 实验源地址: https://www.lanqiao.cn/courses/115/learning/ 1.完成bootsect.s屏 ...

  8. linux信号嵌套,LINUX0.11信号机制

    原标题:LINUX0.11信号机制 一.信号的本质 信号(signal)是Linux操作系统在软件层面上对中断的模拟,是一种异步通信机制.进程之间可以相互发送信号来通知对方发生了什么事情,一个进程不必 ...

  9. linux0.11字符设备驱动及访问请求管理程序阅读注释笔记

    [ 1] linux0.11引导程序阅读注释. [ 2] linux0.11由实模式进入保护模式程序阅读注释 . [ 3] linux0.11护模式初始化程序阅读注释. [ 4] linux0.11主 ...

最新文章

  1. Android--解析XML之SAX
  2. linux 脚本返回值
  3. TikZ绘图示例——尺规作图: 圆内接正九边形的近似画法
  4. java初入多线程5
  5. android 系统(154)----OTA制作及升级过程
  6. 小米再添猛将!原中兴手机CEO曾学忠加盟
  7. Oracle用户和模式的区别
  8. linux 编译运行c文件
  9. Lock锁的简单使用
  10. Continue(Java)
  11. [NOIP2016] 天天爱跑步 桶 + DFS
  12. 阶段3 3.SpringMVC·_07.SSM整合案例_02.ssm整合之搭建环境
  13. Linux 进程地址空间1_数据结构和接口
  14. 主题抽取的核心——主题词表
  15. 基于微信小程序的学生活动管理系统的设计与实现
  16. 有损压缩、无损压缩(图片、音频、视频)
  17. 20220527_Java_反射的各种方法
  18. 斯隆论社会责任:德鲁克日志之四月二十五日
  19. OSF Jonathan Bryce:Open Infrastructure开启开放协作新时代
  20. 雷电模拟器dnconsole命令汇总

热门文章

  1. 无法解决 equal to 操作中 Chinese_PRC_CI_AS_WS 和 Chinese_PRC_CI_AS 之间的排序规则冲突...
  2. 最简单的nagios监控内存插件(shell)
  3. sqlite 实例教程 IOS下用sqlite打造词典
  4. 企业网络项目PT模拟
  5. pluto实现分析(7)
  6. platform下的js分析_1
  7. 点击图片传值到text 尚未解决
  8. 用IP地址的用途理解Loopback接口
  9. (转)Apache的安装与配置
  10. arm-linux-gcc的安装