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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

linux 系统调用 read,write和lseek 使用

發布時間:2023/11/27 生活经验 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux 系统调用 read,write和lseek 使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

read系統調用

  • 頭文件 #include <unistd.h>
  • 函數使用 ssize_t read(int fd, void *buf, size_t count)
    read 函數會從文件描述符fd中讀取指定的count長度的內容,并且將讀到的結果放入到buf緩沖區中
  • 返回值
    count 讀取成功,則會返回讀到的字節數
    小于count 表示同樣讀取成功,只是fd從current offset中并未讀到count的字節數
    0 表示讀到了文件的末尾
    -1 表示讀取失敗,可能fd已經關閉,可能讀到了一個管道,或者read被內核信號中斷

注意:
read操作會從當前文件的文件偏移處進行讀取,同時 文件偏移會隨著讀到的長度進行移動。如果當前文件的偏移地址是在上一個文件的結束,那就無法讀到fd中的內容。所以這里如果想要讀取文件中的內容,在使用read系統調用之前需要重新設置偏移地址lseek

其他詳細描述可以參考man 2 read

write系統調用

  • 頭文件 #include <unistd.h>
  • 函數使用 ssize_t write(int fd, const void *buf, size_t count)
    write函數會向文件描述符fd中寫入count bytes的內容,內容的來源是buf
  • 返回值
    count 寫入的數據大小 bytes
    0 沒有寫入任何東西
    -1 表示寫入失敗

read一樣,write也是基于當前文件的偏移地址開始寫入,同時文件的偏移隨著寫入的數據進行移動
其他詳細描述可以參考man 2 write

lseek系統調用

  • 頭文件
    #include <unistd.h>
    #include <sys/types.h>

  • 函數使用 off_t lseek(int fd, off_t offset, int whence)
    lseek函數會將文件描述符fd所代表的當前文件偏移地址移動指定的偏移量offset,移動方式是通過whence
    其中whence有如下幾種:
    a. SEEK_SET 如果offset為0,則讀寫位置移動到開頭。如果不為0,則讀寫位置在當前位置基礎上向前移動offset個字節
    b. SEEK_CUR將讀寫位置移動到當前位置后再增加offset個字節
    c. SEEK_END 將讀寫位置移動到文件結尾后再增加offset個字節

  • 返回值
    offset 成功則返回該值。該offset并非參數傳入的offset,而是移動偏移量之后 當前偏移量相對于文件開頭的偏移量值
    -1 移動偏移量失敗

代碼案例


#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <string.h>int main()
{int fd;char buf[100];memset(buf,0,sizeof(buf));fd = open("write.test",O_RDWR|O_APPEND); //追加可 讀寫方式打開了一個文件size_t x = write(fd,"my name is hello \n",20)  //寫入20個字符串printf("you have writed %d words to the buffer and off is %d\n",x,fd);//close(fd); //此時close,則后續的lseek都返回 -1//如果此時不進行lseek,則后續read讀出的buf是空的。lseek此時使用`SEEK_SET`的`whence`,即跳到文件開頭進行偏移off_t k = lseek(fd,10,SEEK_SET); printf("The file offset is %d\n",k);size_t t = read(fd,buf,20);printf("you have read %d words and %s content\n",t,buf);close(fd);return 0;
}

輸出如下:

[root@localhost ~]# ./a.out 
you have writed 20 words to the buffer and off is 3
The file offset is 10 //向前移動10個字符,最后讀出的內容是 “hello \n”
you have read 10 words and  hello content
[root@localhost ~]# cat write.test 
my name is hello 

總結

以上是生活随笔為你收集整理的linux 系统调用 read,write和lseek 使用的全部內容,希望文章能夠幫你解決所遇到的問題。

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