現在,假設 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); }
本文URL地址:http://www.bianceng.cn/OS/Linux/201410/45411.htm
這是一段用戶進程的程序,通過這樣一段代碼就能將 “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 組合應用,從而實現文件修改的全過程。