函數read、write、lseek

?

函數原型:?

#include<unistd.h>
ssize_t read(int fd, void *buf, size_t count);返回值:讀到的字節數,若已到文件尾,返回0;若出錯,返回-1

參數:

  • fd:函數open的返回值
  • buf:緩沖區,存儲要讀取的數據
  • count:緩沖區的最大字節數size(buf)

?

函數原型:

#include<unistd.h>
sszie_t write(int fd, const void *buf, size_t count);返回值:若成功,返回已寫的字節數,若出錯,返回-1

參數:

  • fd:函數open返回值
  • buf:要寫到文件的數據
  • count:strlen(buf)

?

測試代碼:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>int main(int argc, const char* argv[])
{int fd = open("english.txt", O_RDWR);printf(" fd = %d\n", fd);int fd1 = open("temp", O_WRONLY | O_CREAT, 0664);printf("fd1 = %d\n",fd1);char buf[4096];int len = read(fd, buf, sizeof(buf));while(len > 0) {int ret = write(fd1, buf, len);printf("ret = %d\n", ret);len = read(fd, buf, sizeof(buf));}close(fd);close(fd1);return 0;
}

輸出結果:

?

函數原型:
?

#include<unistd.h>
off_t lssk(int fd, off_t offset, int whence);返回值:若成功, 返回新的文件的偏移量;若出錯,返回-1

參數:

  • 若whence是SEEK_SET,則將該文件的偏移量設置為距文件的開始處offset個字節。
  • 若whence是SEEK_CUR,則將該文件的偏移量設置為當前值加offset,offset可正可負。
  • 若whence是SEEK_END,則將該文件的偏移量設置為文件長度加offset,offset可正可負。

使用:

  • 文件指針移動到頭部:lseek(fd, 0, SEEK_SET);
  • 獲取文件指針當前位置:int len = lseek(fd, 0, SEEK_CUR);
  • 獲取文件長度:int len = lseek(fd, 0, SEEK_END);
  • 文件拓展:文件原大小100k,拓展為1100k。lseek(fd, 1000, SEEK_END); 最后一次寫操作:write(fd, "a", 1);

?

測試代碼:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
#include <fcntl.h>int main(int argc, const char *argv[])
{int fd = open("english.txt", O_RDWR);if(fd == -1) {perror("open error");exit(1);}int len = lseek(fd, 1000, SEEK_END);printf("len = %d\n", len);write(fd, "a", 1);close(fd);return 0;
}


輸出結果:

?

阻塞與非阻塞

阻塞和非阻塞是文件的屬性還是read函數的屬性? 答案:文件的屬性

  • 普通文件:hello.c 不阻塞
  • 終端設備:/dev/tty、管道、套接字:,默認阻塞

?

1. 阻塞讀終端

測試代碼:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>int main()
{char buf[10];int n;n = read(STDIN_FILENO, buf, 10);if(n < 0) {perror("read STDIN_FILENO");exit(1);}write(STDOUT_FILENO, buf, n);return 0;
}

輸出結果:

分析:

?

測試代碼:

#include <unistd.h> 
#include <fcntl.h>
#include <string.h>
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#define MSG_TRY "try agin\n"int main()
{char buf[10];int fd, n;// /dev/tty --->當前打開的終端設備fd = open("/dev/tty", O_RDONLY | O_NONBLOCK);if(n < 0) {perror("open /dev/tty");exit(1);}tryagin:n = read(fd, buf, 10);if(n < 0) {//如果write為非阻塞,但是沒有數據可讀,此時全局變量errno被設置為EAGAINif(errno == EAGAIN) {sleep(3);write(STDOUT_FILENO, MSG_TRY, strlen(MSG_TRY));goto tryagin;}perror("read /dev/tty");exit(1);}write(STDOUT_FILENO, buf, n);close(fd);return 0;
}

輸出結果:

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/385604.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/385604.shtml
英文地址,請注明出處:http://en.pswp.cn/news/385604.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java這些高端技術只有你還不知道,薪資翻倍

正文 我的第一份工作是在一家外企&#xff0c;當時抱著“逃離”上海的想法去了二線城市的分公司&#xff0c;但是管理文化氛圍跟總部幾乎都是一樣的&#xff0c;這份工作經歷對我后面的工作不論是做事風格、習慣上還是思考問題的方式方法上都有很大的影響。后面陸續進入國企&a…

函數dup和dup2

函數原型&#xff1a; #include<unistd.h> int dup(int oldfd);返回值&#xff1a;若成功&#xff0c;返回新的文件描述符&#xff1b;若出錯&#xff0c;返回-1 參數&#xff1a; oldfd&#xff1a;要復制的文件描述符dup調用成功&#xff1a;有兩個文件描述符指向同…

Java進階面試資料無償分享!真香系列

8-22 投遞簡歷 8-24 一面&#xff08;大概1h50min&#xff09; 0、currenthashmap怎么擴容的&#xff1f;fwn為什么固定hash -1&#xff0c;這樣設計有什么好處&#xff1f;幫助擴容是發生在什么階段?讀線程和寫線程都會幫助擴容嗎&#xff1f;擴容的時候任務具體怎么協調的&…

Java通用流行框架大全,絕對干貨

Java如何入門&#xff1f; 1、建立好開發環境 首先建立好開發環境非常重要&#xff0c;工欲善其事&#xff0c;必先利其器。做任何開發&#xff0c;首先就是要把這個環境準備好&#xff0c;之后就可以去做各種嘗試&#xff0c;嘗試過程中就能逐漸建立信心。初學者往往在環境配…

Java集合類中絕對占有一席之地的List,漲薪7K!

一、先來解讀&#xff1a;23種設計模式要點 1.單例模式&#xff08;Singleton Pattern&#xff09; 2.工廠模式 3.抽象工廠模式&#xff08;Abstract Factory Pattern&#xff09; 4.模板方法模式&#xff08;Template Method Pattern&#xff09; 5.建造者模式&#xff08;Bu…

Java面試10大知識點總結寶典助你通關!已拿意向書!

Java基礎 1.Java語言的三大特性 2.Java語言主要特性 3. JDK和JRE有什么區別 4.Java基本數據類型及其封裝類 5.如果main方法被聲明為private會怎樣? 6.說明- -下public static void main(String argsQ])這段聲明里每個關鍵字的作用 7.與equals的區別 8.Object有哪些公用方法 9.…

互斥鎖、條件變量

一、互斥鎖 1. 函數原型&#xff1a; pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr); pthread_mutex_destroy(pthread_mutex_t *mutex); 分析&#xff1a; pthread_mutex_t 類型&#xff0c;其本質是一個結構體&#xf…

Java面試你必須要知道的那些知識,深夜思考

如何提升自己的實力&#xff1f; Step 1&#xff1a;梳理自己的知識 對照下面這份學習大綱&#xff0c;梳理出自己的知識盲區&#xff0c;這份大綱里面的技術點完全對標P7崗的主流技術&#xff0c;因此這是一份很好的知識大綱筆記。 Step 2&#xff1a;查漏補缺&#xff0c;夯…

Java面試你必須要知道的那些知識,面試建議

二、面試題 面&#xff1a;考你幾個紅黑樹的知識點&#x1f980; 紅黑樹的數據結構都用在哪些場景&#xff0c;有什么好處&#xff1f;紅黑樹的時間復雜度是多少&#xff1f;紅黑樹中插入新的節點時怎么保持平衡&#xff1f; 面&#xff1a;2-3樹都是不沒看&#xff0c;回去…

存儲映射I/O(一)

一、存儲映射I/O 存儲映射I/O使一個磁盤文件與存儲空間中的一個緩沖區映射&#xff0c;于是當從緩沖區中取數據&#xff0c;就相當于讀文件中的相應字節。于此類似&#xff0c;將數據存入緩沖區&#xff0c;則相應的字節就自動寫入文件&#xff0c;這樣&#xff0c;就可在不不…

【絕對干貨】kafkastream廣告

Java如何入門&#xff1f; 1、建立好開發環境 首先建立好開發環境非常重要&#xff0c;工欲善其事&#xff0c;必先利其器。做任何開發&#xff0c;首先就是要把這個環境準備好&#xff0c;之后就可以去做各種嘗試&#xff0c;嘗試過程中就能逐漸建立信心。初學者往往在環境配…

存儲映射IO(二)

mmap父子進程間通信 1. 測試代碼&#xff1a; #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> #include <sys/mman.h> #include <sys/wait.h>int var 100;int main(void) {int *p;pid_t pid;int fd;…

【聊透SpringMVC】java技術經理崗位職責

緩存維護方案一 如果是一讀&#xff08;線程B&#xff09;一寫&#xff08;線程A&#xff09;操作&#xff0c;「先操作緩存&#xff0c;再操作數據庫」。流程圖如下所示&#xff1a; 1.線程A發起一個寫操作&#xff0c;第一步del cache 2.線程A第二步寫入新數據到DB 3.線程…

【聊透SpringMVC】自學java和三大框架要多久

餓了么一面&#xff08;Java&#xff09; hashmap源碼問題 HashMap底層結構 put操作講一下 HashMap、HashMap如何保證線程安全、ConcurrentHashMap JVM有哪些回收算法&#xff0c;對應的收集器有哪些&#xff1f; jvm g1的內存模型講一下&#xff0c;G1和CMS收集器的區別&#…

【設計思想解讀開源框架】mysql官方文檔中文版下載免費

01 源碼分析 源碼閱讀&#xff0c;最核心有三點&#xff1a;技術基礎強烈的求知欲耐心。 1.1 設計模式&#xff08;45設計模式&#xff1a;介紹優缺點應用實例源代碼解決問題&#xff09; 1.2 Spring復習大綱&#xff1a;依賴注入IocBeans注解數據訪問AOPMVC等 1.3 Spring全家…

命令新參

命令形參&#xff1a; 命令行參數是使用main()函數參數來處理的&#xff0c;其中&#xff0c;argc是指傳入參數的個數&#xff0c;argv[]是一個指針數組&#xff0c;指向傳遞給程序的每個參數。 應當指出的是&#xff0c; argv[0]存儲程序的名稱&#xff0c;argv[1]是一個指向…

【金三銀四】啟動mysql服務器

微服務架構 ①微服務概念&#xff1a; ②Spring Cloud微服務架構&#xff1a; 海量數據處理 ①&#xff1a;經典的海量數據處理面試題 高可用架構 ①基于 Hystrix 實現高可用&#xff1a; ②限流&#xff1a; ③熔斷&#xff1a; 高并發架構 ①消息隊列&#xff1a; ②搜索…

函數fork vfork

一、函數fork fork函數原型&#xff1a; #include <unistd.h> pid_t fork(void); 二、程序清單 1. 測試代碼&#xff1a; #include <unistd.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <string.h>…

【金三銀四】微軟java后端社招

分布式系統特性與衡量標準 透明性&#xff1a;使用分布式系統的用戶并不關心系統是怎么實現的&#xff0c;也不關心讀到的數據來自哪個節點&#xff0c;對用戶而言&#xff0c;分布式系統的最高境界是用戶根本感知不到這是一個分布式系統 可擴展性&#xff1a;分布式系統的根…

【面試必會】java虛擬機原理

如何才可以進大廠&#xff1f; 答案其實也很簡單&#xff0c;能力學歷。不知道大家有沒有發現&#xff0c;大廠的一些部門對于學歷要求已經放低了&#xff0c;阿里的一些部門同樣也招大專學歷的程序員&#xff0c;當然肯定也是因為他的能力足夠出色。 對于準備秋招的你來說&a…