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 ...
随机推荐
- mongo数据删除和游标
数据删除 db.集合.remove(删除条件,是否只删除一个数据);默认删多条(false)true删除一条db.集合.remove({}) 删除所有元素但集合还在db.集合.drop() 删除集合 ...
- 地址下拉框,需要js级联js
function area() { _url = "/ashx/DropDownControl.ashx"; _swType = "GetArea"; _z = ...
- Fiddler实现对手机抓包
工具 && 前提条件: 1. 安装了Fiddler的PC一台 2. 手机一部 3. 手机和PC是在同一个局域网内,或者至少能够联通,即手机的流量能够转发到PC端上能够被其捕获 PC端 ...
- UIkit复习:UIContorl及子控件的剖析
1.模块继承关系: 1.UIButton ->UIControl -> UIView 2.UILabel ->UIview 3.UIImageVie ...
- Docker如何获取镜像
可以使用 docker pull 命令来从仓库获取所需要的镜像. 下面的例子将从 Docker Hub 仓库下载一个 Ubuntu 12.04 操作系统的镜像. $ sudo docker pull ...
- vue关于数组使用的坑
关于数组使用的坑 https://vuejs.org/v2/guide/list.html#Caveats 简言之, 不要使用a[i] = v 的形式, 用a.splice(i, 1, v), 或Vu ...
- 输入一个正数n,输出所有和为n连续正数序列。例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以输出3个连续序列1-5、4-6和7-8。
输入一个正数n,输出所有和为n连续正数序列.例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以输出3个连续序列1-5.4-6和7-8. #define N 15 void findS ...
- tomcat自动运行磁盘任意位置上的项目、使用Maven对tomcat进行自动部署
对于非Maven的web项目,有时候我们想不时常通过打war包.拷贝war包.启动tomcat来运行项目.这时候我们可以通过以下方式来进行配置: 1.1:创建web工程.工程结构如下: 1.2. ...
- [ExtJS5学习笔记]第三十二节 sencha extjs 5与struts2的ajax交互配置
本文地址:http://blog.csdn.net/sushengmiyan/article/details/43487751 本文作者:sushengmiyan ------------------ ...
- iOS让软键盘消失的简单方法
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 一些文本输入控件等待输入时会弹出软键盘,我们可以设置这些控件的 ...