Linux下系统函数open,read,write,lseek函数
一、簡介
1. open
- 頭文件
#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h>
-
定義函數(shù):
int open(const char * pathname, int flags);
int open(const char * pathname, int flags, mode_t mode); -
函數(shù)說明:
第一個參數(shù)pathname 指向欲打開的文件路徑字符串。
第二參數(shù)flags 所能使用的旗標(biāo):
1.O_RDONLY 只讀打開。
2.O_WRONLY 只寫打開。
3.O_RDWR 讀、寫打開。
4.O_APPEND 每次寫時都加到文件的尾端。
5.O_CREAT 若此文件不存在則創(chuàng)建它。使用此選擇項(xiàng)時,需同時說明第
第三個參數(shù)mode,用其說明該新文件的存取許可權(quán)位。
參數(shù)mode 則有下列數(shù)種組合, 只有在建立新文件時才會生效, 此外真正建文件時的權(quán)限會受到umask 值所影響, 因此該文件權(quán)限應(yīng)該為 (mode-umaks).
S_IRWXU00700 權(quán)限, 代表該文件所有者具有可讀、可寫及可執(zhí)行的權(quán)限.
S_IRUSR 或S_IREAD, 00400 權(quán)限, 代表該文件所有者具有可讀取的權(quán)限.
S_IWUSR 或S_IWRITE, 00200 權(quán)限, 代表該文件所有者具有可寫入的權(quán)限.
S_IXUSR 或S_IEXEC, 00100 權(quán)限, 代表該文件所有者具有可執(zhí)行的權(quán)限.
S_IRWXG 00070 權(quán)限, 代表該文件用戶組具有可讀、可寫及可執(zhí)行的權(quán)限.
2.Read
- 定義函數(shù)
ssize_t read(int fd, void * buf, size_t count);
- 使用的頭文件:
#include <unistd.h>
- 函數(shù)的參數(shù)說明
【int fd】這個是文件指針
【void *buf】讀上來的數(shù)據(jù)保存在緩沖區(qū)buf中,同時文件的當(dāng)前讀寫位置向后移
【size_t count】是請求讀取的字節(jié)數(shù)。若參數(shù)count 為0, 則read()不會有作用并返回0. 返回值為實(shí)際讀取到的字節(jié)數(shù), 如果返回0
3.Write
- 定義函數(shù)
ssize_t write (int fd, const void * buf, size_t count);
- 函數(shù)說明
write()會把參數(shù)buf 所指的內(nèi)存寫入count 個字節(jié)到參數(shù)fd 所指的文件內(nèi). 當(dāng)然, 文件讀寫位置也會隨之移動.
4.sleek
-
定義函數(shù)
off_t lseek(int fildes,off_t offset,int whence) -
函數(shù)說明
每個已打開的文件都有一個讀寫位置,當(dāng)打開文件通常的讀寫位置是指向文件的開頭,若是以追加的方式打開(調(diào)用open 函數(shù)時使用了O_APPEND),則讀寫位置會指向文件末尾,當(dāng)調(diào)用read()或creat()時,讀寫的位置隨之增加;參數(shù)fildes為已打開的文件描述符,參數(shù)offset為根據(jù)參數(shù)whence來移動的讀寫位置的偏移量.文件指針的值等于當(dāng)前指針的值加上offset的值。 -
1.SEEK_SET
-從文件開始處計算偏移量,文件指針到文件開始處的偏移量為offset. -
2.SEEK_CUR
-從文件的指針的當(dāng)前位置開始計算偏移量,文件指針值等于當(dāng)前指針值加上offset的值,offset允許為負(fù)數(shù). -
3.SEEK_END
-從文件的結(jié)尾處計算偏移量,文件指針值等于當(dāng)前指針的值加上offset的值.offset 允許取負(fù)數(shù)
二、實(shí)現(xiàn)文件的復(fù)制
#include <stdio.h> #include <string.h> #include <sys/types.h> #include <sys/stat.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h>int main(int argc, const char* argv[]) {int fd01 = open("english.txt", O_RDWR);//可讀可寫printf("fd01=%d\n", fd01);if (fd01 == -1){perror("Open failed");//錯誤代碼寫入errno,perror根據(jù)errno的數(shù)值顯示相對應(yīng)的錯誤}//打開另一個文件,若沒有則建立int fd02 = open("test04", O_WRONLY | O_CREAT, 0777);printf("fd02=%d\n", fd02);//read讀4Kchar buf[1024 * 2];//緩沖區(qū)int len = read(fd01, buf, sizeof(buf));//sizeof包含\0while (len > 0)//==0就是讀完{int fd03 = write(fd02, buf, len);//寫printf("fd03=%d", fd03);//文件指針再移動4k,繼續(xù)讀len = read(fd01, buf, sizeof(buf));}close(fd01);close(fd02);return 0; } gcc system_func.c -o system_func ./system_func vim test04結(jié)果顯示:
三、文件的拓展(lseek)
#include <stdio.h> #include <string.h> #include <sys/types.h> #include <sys/stat.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h>int main(int argc, const char* argv[]) {int fd = open("english.txt", O_RDWR);if (fd == -1){perror("open error!");}//文件指針移到最后,再偏移1000int len = lseek(fd, 1000, SEEK_END);write(fd, "a", 1);//必須寫入才生效close(fd);return 0; } ll english.txt gcc lseekTest.c -o lseekTest ./lseekTest ll english.txt結(jié)果顯示:
說明:
系統(tǒng)顯示全是亂碼,其實(shí)全部是"\0",占位的作用。
- 如下載一個10G電影,剛開始就會在磁盤上先分配10G內(nèi)存,先占位,怕后面別人占用。
- 下載是多線程的,如1號指針負(fù)責(zé)前部分,2號指針負(fù)責(zé)后部分,占位后2號指針才能找到,才能移動過。
總結(jié)
以上是生活随笔為你收集整理的Linux下系统函数open,read,write,lseek函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 回调函数案列(C高级)
- 下一篇: 数据结构一:链表(linux链表)