Linux0.11中对文本文件进行修改的策略
现在,假设 hello.txt 是硬盘上已有的一个文件,而且内容为 “hello, world” ,在文件的当前指针设置完毕后,我们来介绍 sys_read , sys_write , sys_lseek 如何联合使用才能把数据插入到 hello.txt 中。
可以通过如下方式对它们进行组合应用,应用程序的代码如下:
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#define LOCATION 6
int 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中对文本文件进行修改的策略的更多相关文章
- 从linux0.11中起动部分代码看汇编调用c语言函数
上一篇分析了c语言的函数调用栈情况,知道了c语言的函数调用机制后,我们来看一下,linux0.11中起动部分的代码是如何从汇编跳入c语言函数的.在LINUX 0.11中的head.s文件中会看到如下一 ...
- 在Linux-0.11中实现基于内核栈切换的进程切换
原有的基于TSS的任务切换的不足 进程切换的六段论 1 中断进入内核 2 找到当前进程的PCB和新进程的PCB 3 完成PCB的切换 4 根据PCB完成内核栈的切换 5 切换运行资源LDT 6 利用I ...
- 对Linux0.11 中 进程0 和 进程1分析
1. 背景 进程的创建过程无疑是最重要的操作系统处理过程之一,很多书和教材上说的最多的还是一些原理的部分,忽略了很多细节.比如,子进程复制父进程所拥有的资源,或者子进程和父进程共享相同的物理页面,拥有 ...
- Linux0.11 中对地址的管理
个字节,段信息无法直接存放在段寄存器中(段寄存器只有2字节).Intel的设计是段描述符集中存放在GDT或LDT中,而段寄存器存放的是段描述符在GDT或LDT内的索引值(index). Linux中逻 ...
- linux0.11改进之四 基于内核栈的进程切换
这是学习哈工大李治军在mooc课操作系统时做的实验记录.原实验报告在实验楼上.现转移到这里.备以后整理之用. 完整的实验代码见:实验楼代码 一.tss方式的进程切换 Linux0.11中默认使用的是硬 ...
- x01.os.20: compile linux-0.11 on the ubuntu
为什么学习 linux 正如不能依靠美国的 GPS 为我们的导弹指示目标一样,很难想像用运行 windows 的电脑去同美国进行信息战.而朝鲜的网络崩溃,再次警示国人,信息战.网络战离我们并不遥远.l ...
- Linux0.11启动过程
从开机加电,到执行main函数之前的过程 好吧,这里应该是有执行3个汇编的文件,但是我不太了解.囧 从main函数,到启动OK(即可以响应用户操作了) 这个步骤做了3件事情: 创建进程0,使之具备在主 ...
- Linux0.11内核剖析--内核体系结构
一个完整可用的操作系统主要由 4 部分组成:硬件.操作系统内核.操作系统服务和用户应用程序,如下图所示: 用户应用程序是指那些字处理程序. Internet 浏览器程序或用户自行编制的各种应用程序: ...
- [Operating System Labs] 我对Linux0.00中 head.s 的理解和注释
?21,# head.s contains the 32-bit startup code.# head.s 是32位的启动代码 # Two L3 task multitasking. The ...
随机推荐
- Check the string CodeForces - 960A
A has a string consisting of some number of lowercase English letters 'a'. He gives it to his friend ...
- let 和 const 命令
let 命令 基本用法 ES6 新增了let命令,用来声明变量.它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效. { let a = 10; var b = 1; } a / ...
- JavaScript 字符串(String)对象
String 对象用于处理已有的字符块. JavaScript 字符串 一个字符串用于存储一系列字符就像 "John Doe". 一个字符串可以使用单引号或双引号: 实例 var ...
- DB 查询分析器7.01 新增的保存执行结果到多个文件功能
1 引言 中国本土程序员马根峰(CSDN专访马根峰:海量数据处理与分析大师的中国本土程序员)推出的个人作品----万能数据库查询分析器,中文版本DB 查询分析器.英文版本< ...
- 大数据基础知识问答----spark篇,大数据生态圈
Spark相关知识点 1.Spark基础知识 1.Spark是什么? UCBerkeley AMPlab所开源的类HadoopMapReduce的通用的并行计算框架 dfsSpark基于mapredu ...
- Android简易实战教程--第四十三话《上拉加载与下拉刷新》
ListView的下拉刷新很常见,很多开源的框架都能做到这个效果,当然也可以自己去实现.本篇案例是基于xlistview的. 布局: <RelativeLayout xmlns:android= ...
- Scala: 简介和安装
http://blog.csdn.net/pipisorry/article/details/52902117 Note: lz只是稍微学学,能看懂就行,不深入.适合scala小白. Scala简介 ...
- Ubuntu使用dpkg安装软件依赖问题解决 ubuntu-tweak ubuntu 16.04 LTS 系统清理
Ubuntu使用dpkg安装软件依赖问题解决 这里以在ubuntu 16.04安装Ubuntu Tweak为例进行说明,通常安装包依赖问题都可以用这种方法解决: sudo apt-get instal ...
- UE4实现闪烁效果
官网文档链接:http://docs.unrealengine.com/latest/CHN/Engine/Rendering/Materials/ExpressionReference/Math/i ...
- 2.关于QT中数据库操作,简单数据库连接操作,数据库的增删改查,QSqlTableModel和QTableView,事务操作,关于QItemDelegate 代理
Linux下的qt安装,命令时:sudoapt-get install qt-sdk 安装mysql数据库,安装方法参考博客:http://blog.csdn.net/tototuzuoquan ...