日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux下系统函数open,read,write,lseek函数

發布時間:2025/3/12 linux 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux下系统函数open,read,write,lseek函数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、簡介

1. open

  • 頭文件

#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h>

  • 定義函數:

    int open(const char * pathname, int flags);
    int open(const char * pathname, int flags, mode_t mode);

  • 函數說明:
    第一個參數pathname 指向欲打開的文件路徑字符串。
    第二參數flags 所能使用的旗標:
    1.O_RDONLY 只讀打開。
    2.O_WRONLY 只寫打開。
    3.O_RDWR 讀、寫打開。
    4.O_APPEND 每次寫時都加到文件的尾端。
    5.O_CREAT 若此文件不存在則創建它。使用此選擇項時,需同時說明第
    第三個參數mode,用其說明該新文件的存取許可權位。
    參數mode 則有下列數種組合, 只有在建立新文件時才會生效, 此外真正建文件時的權限會受到umask 值所影響, 因此該文件權限應該為 (mode-umaks).
    S_IRWXU00700 權限, 代表該文件所有者具有可讀、可寫及可執行的權限.
    S_IRUSR 或S_IREAD, 00400 權限, 代表該文件所有者具有可讀取的權限.
    S_IWUSR 或S_IWRITE, 00200 權限, 代表該文件所有者具有可寫入的權限.
    S_IXUSR 或S_IEXEC, 00100 權限, 代表該文件所有者具有可執行的權限.
    S_IRWXG 00070 權限, 代表該文件用戶組具有可讀、可寫及可執行的權限.

2.Read

  • 定義函數

ssize_t read(int fd, void * buf, size_t count);

  • 使用的頭文件:

#include <unistd.h>

  • 函數的參數說明

【int fd】這個是文件指針
【void *buf】讀上來的數據保存在緩沖區buf中,同時文件的當前讀寫位置向后移
【size_t count】是請求讀取的字節數。若參數count 為0, 則read()不會有作用并返回0. 返回值為實際讀取到的字節數, 如果返回0

3.Write

  • 定義函數

ssize_t write (int fd, const void * buf, size_t count);

  • 函數說明

write()會把參數buf 所指的內存寫入count 個字節到參數fd 所指的文件內. 當然, 文件讀寫位置也會隨之移動.

4.sleek

  • 定義函數
    off_t lseek(int fildes,off_t offset,int whence)

  • 函數說明
    每個已打開的文件都有一個讀寫位置,當打開文件通常的讀寫位置是指向文件的開頭,若是以追加的方式打開(調用open 函數時使用了O_APPEND),則讀寫位置會指向文件末尾,當調用read()或creat()時,讀寫的位置隨之增加;參數fildes為已打開的文件描述符,參數offset為根據參數whence來移動的讀寫位置的偏移量.文件指針的值等于當前指針的值加上offset的值。

  • 1.SEEK_SET
    -從文件開始處計算偏移量,文件指針到文件開始處的偏移量為offset.

  • 2.SEEK_CUR
    -從文件的指針的當前位置開始計算偏移量,文件指針值等于當前指針值加上offset的值,offset允許為負數.

  • 3.SEEK_END
    -從文件的結尾處計算偏移量,文件指針值等于當前指針的值加上offset的值.offset 允許取負數

二、實現文件的復制

#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根據errno的數值顯示相對應的錯誤}//打開另一個文件,若沒有則建立int fd02 = open("test04", O_WRONLY | O_CREAT, 0777);printf("fd02=%d\n", fd02);//read讀4Kchar buf[1024 * 2];//緩沖區int len = read(fd01, buf, sizeof(buf));//sizeof包含\0while (len > 0)//==0就是讀完{int fd03 = write(fd02, buf, len);//寫printf("fd03=%d", fd03);//文件指針再移動4k,繼續讀len = read(fd01, buf, sizeof(buf));}close(fd01);close(fd02);return 0; } gcc system_func.c -o system_func ./system_func vim test04

結果顯示:

三、文件的拓展(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

結果顯示:

說明:
系統顯示全是亂碼,其實全部是"\0",占位的作用。

  • 如下載一個10G電影,剛開始就會在磁盤上先分配10G內存,先占位,怕后面別人占用。
  • 下載是多線程的,如1號指針負責前部分,2號指針負責后部分,占位后2號指針才能找到,才能移動過。

總結

以上是生活随笔為你收集整理的Linux下系统函数open,read,write,lseek函数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。