《Linux C函數與算法》
《Linux C函數與算法》 |
版本 |
作者 |
參與者 |
完成日期 |
備註 |
YanlzLinux_C_V01_1.0 |
嚴立鑽 |
|
2020.02.03 |
|
|
|
|
|
|
##《Linux C函數與算法》發佈說明:
++++“Linux C函數與算法”:是對“Linux系統編程”的綜合探索;開發Linux環境下的應用程序時,需要使用大量的Linux函數;這些函數有的屬於Linux操作系統的API,有的屬於C語言的標準庫函數;
++++“Linux C函數與算法”:定位在一個科普類知識,瞭解Linux環境下的應用程序開發!
++++Tips:“Linux C獨立篇”:是《C/C++函數與算法》的姊妹篇,“Linux C獨立篇”將以Linux系統爲開發環境;
++++姊妹篇推薦:
++++【C/C++函數與算法(C庫獨立篇)】:https://blog.csdn.net/VRunSoftYanlz/article/details/104026090
++++【C/C++函數與算法(C++庫獨立篇)】:https://blog.csdn.net/VRunSoftYanlz/article/details/104062275
++++【C/C++函數與算法(算法獨立篇)】:https://blog.csdn.net/VRunSoftYanlz/article/details/104062527
++++【Linux系統編程】分類:https://blog.csdn.net/vrunsoftyanlz/category_9694767.html
++++【C++C鑄就生存利器】分類:https://blog.csdn.net/vrunsoftyanlz/category_9325802.html
++++【人工智能AI2026】分類:https://blog.csdn.net/vrunsoftyanlz/category_9212024.html
++++【立鑽哥哥CSDN空間】:https://blog.csdn.net/VRunSoftYanlz/
@@提示:有些博客可能只是開了頭,如果感興趣的同學,可以“點贊”或“評論區留言”,只要關注的同學多了,那就會繼續完善喲!(“++==”,表示沒有寫完的,如果關注度不高就不完善了;“++ok++”,表示此篇博客已經完成,是階段性完整的!)
++++VR雲遊戲=Unity+SteamVR+雲技術+5G+AI;(說明:AI人工智能不是我們的主要研究技術,只是瞭解一下,領略一下有風的感覺!但是,VR是我們的研究重點)
##《Linux C函數與算法》目錄
#第一篇:Linux系統編程
#第二篇:Linux系統下的C開發
#第三篇:Linux網絡編程
#第四篇:Linux內核驅動
#第五篇:立鑽哥哥帶您Linux系統編程
#第一篇:Linux系統編程
#第一篇:Linux系統編程 |
#第一篇:Linux系統編程
++++立鑽哥哥:程序是一個精確說明如何進行計算的指令序列;編寫程序可以說就是這樣一個過程:把複雜的任務分解成子任務,把子任務再分解成更簡單的任務,層層分解,直到最後簡單到可以用指令來完成;
++++A1、文件與I/O
++++A2、文件系統
++++A3、進程
++++A4、Shell腳本
++++A5、正則表達式
++++A6、信號
++++A7、終端、作業控制與守護進程
++++A8、線程
++++A9、TCP/IP協議基礎
++++A10、Socket編程
++++A11、立鑽哥哥帶您Linux系統編程
++A1、文件與I/O
++A1、文件與I/O |
++A1、文件與I/O
++++立鑽哥哥:學習Linux系統函數,這些函數的用法必須結合Linux內核的工作原理來理解,因爲系統函數正是內核提供給應用程序的接口,而要理解內核的工作原理,必須熟練掌握C語言,因爲內核也是用C語言寫的,在描述內核工作原理時必然要用到“指針”、“結構體”、“鏈表”等來組織;
++++[文件描述符]:是文件描述符表的索引(0、1、2、3),用int型變量來保存;當調用open打開一個現有文件或創建一個新文件時,內核分配一個新的文件描述符並返回給進程,當讀寫該文件時,文件描述符被作爲參數傳給read或write;
#define STDIN_FILENO 0#define STDOUT_FILENO 1#define STDERR_FILENO 2 |
++open
++++立鑽哥哥:open函數可以打開或創建一個文件;
int open(const char *pathname, int flags);int open(const char *pathname, int flags, mode_t mode); |
++close
++++立鑽哥哥:close函數關閉一個已打開文件;
int close(int fd); |
++read/write
++++立鑽哥哥:read函數從打開的設備或文件中讀取數據;write函數向打開的設備或文件中寫數據;
ssize_t read(int fd, void *buf, size_t count);ssize_t write(int fd, const void *buf, size_t count);
|
#include <unistd.h> #include <stdlib.h>
int main(void){ 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; } |
++lseek
++++立鑽哥哥:lseek和標準IO庫的fseek函數類似,可以移動當前讀寫位置(或者叫偏移量);
off_t lseek(int fd, off_t offset, int whence);
|
off_t currpos; currpos = lseek(fd, 0, SEEK_CUR); |
++fcntl
++++立鑽哥哥:可以用fcntl函數改變一個已打開的文件的屬性,可以重新設置讀、寫、追加、非阻塞等標誌(這些標誌稱爲File Status Flag),而不必重新open文件;
int fcntl(int fd, int cmd);int fcntl(int fd, int cmd, long arg);int fcntl(int fd, int cmd, struct flock *lock); |
++ioctl
++++立鑽哥哥:ioctl用於向設備發控制和配置命令,有些命令也需要讀寫一些數據,但這些數據是不能用read/write讀寫的,稱爲Out-of-band數據;
int ioctl(int d, int request, ...); |
++mmap
++++立鑽哥哥:mmap可以把磁盤文件的一部分直接映射到內存,這樣文件中的位置直接就有對應的內存地址,對文件的讀寫可以直接用指針來做而不需要read/write函數;
void *mmap(void *addr, size_t len, int prot, int flag, int filedes, off_t off);int munmap(void *addr, size_t len); |
++A2、文件系統
++A2、文件系統 |
++A2、文件系統
++++立鑽哥哥:文件系統在內核中是如何實現的?如何呈現給用戶一個樹狀的目錄結構?如何處理用戶的文件和目錄操作請求?磁盤是一種順序的存儲介質,一個樹狀的目錄結構如何扯成一條線存到磁盤上?怎樣設計文件系統的存儲格式使訪問磁盤的效率最高?各種文件和目錄操作在磁盤上實際效果是什麼?
++++Linux支持各種各樣的文件系統格式:ext2、ext3、reiserfs、FAT、NTFS、iso9660等,不同的磁盤分區、光盤或其它存儲設備都有不同的文件系統格式,然後這些文件系統都可以mount到某個目錄下;
++ext2文件系統
++++立鑽哥哥:一個磁盤可以劃分成多個分區,每個分區必須先格式化工具格式化成某種格式的文件系統,然後才能存儲文件,格式化的過程會在磁盤上寫一些管理存儲佈局的信息;文件系統中存儲的最小單位是塊(Block),一個塊究竟多大是在格式化時確定的;啓動塊是由PC標準規定的,用來存儲磁盤分區信息和啓動信息,任何文件系統都不能使用啓動塊;啓動塊之後纔是ext2文件系統的開始,ext2文件系統將整個分區劃成若干個同樣大小的塊組(Block Group),每個塊組都由:超級塊(Super Block)、塊組描述符表(GDT,Group Descriptor Table)、塊位圖(Block Bitmap)、inode位圖(inode Bitmap)、inode表(inode Table)、數據塊等部分組成;
++++[超級塊(Super Block)]:描述整個分區的文件系統信息,例如塊大小、文件系統版本號、上次mount的時間等等;超級塊在每個塊組的開頭都有一份拷貝;
++++[塊組描述符表(GDT,Group Descriptor Table)]:由很多塊組描述符組成,整個分區分成多少個塊組就對應有多少個塊組描述符;
++++[塊位圖(Block Bitmap)]:是用來描述整個塊組中哪些塊已用哪些塊空閒的,它本身佔一個塊,其中的每個bit代表本塊組中的一個塊,這個bit爲1表示該塊已用,這個bit爲0表示該塊空閒可用;
++++[inode位圖(inode Bitmap)]:和塊位圖類似,本身佔一個塊,其中每個bit表示一個inode是否空閒可用;
++++[inode表(inode Table)]:inode表佔多少個塊在格式化時就要決定並寫入塊組描述符中;
++++[數據塊]:對於常規文件,文件的數據存儲在數據塊中;
++VFS(Virtual Filesystem,虛擬文件系統)
++++立鑽哥哥:Linux內核在各種不同的文件系統格式之上做了一個抽象層,使得文件、目錄、讀寫訪問等概念成爲抽象層的概念,因此各種文件系統看起來用起來都一樣,這個抽象層稱爲虛擬文件系統(VFS,Virtual Filesystem);
++++每個進程在PCB(Process Control Block)中都保存着一份文件描述符表,文件描述符就是這個表的索引,每個表項都有一個指向已打開文件的指針:已打開的文件在內核中用file結構體表示,文件描述符表中的指針指向file結構體;
++A3、進程
++A3、進程 |
++A3、進程
++++立鑽哥哥:每個進程在內核中都有一個進程控制塊(PCB)來維護進程相關的信息,Linux內核的進程控制塊是task_struct結構體;
++++[fork和exec]:是兩個重要的系統調用;fork的作用是根據一個現有的進程複製出一個新進程,原來的進程稱爲父進程(Parent Process),新進程稱爲子進程(Child Process);系統中同時運行着很多進程,這些進程都是從最初只有一個進程開始一個一個複製出來的;
++exit和_exit函數
++++立鑽哥哥:exit和_exit函數用於終止一個進程;
void exit(int status);void _exit(int status); |
++fork
++++立鑽哥哥:fork用來創建新進程;
pid_t fork(void); |
++exec函數族
++++立鑽哥哥:用fork創建子進程後執行的是和父進程相同的程序(但有可能執行不同的代碼分支),子進程往往要調用一種exec函數以執行另一個程序;當進程調用一種exec函數時,該進程的用戶空間代碼和數據完全被新程序替換,從新程序的啓動例程開始執行;調用exec並不創建新進程,所以調用exec前後該進程的id並未改變;
int execl(const char *path, const char *arg, ...);int execlp(const char *file, const char *arg, ...);int execle(const char *path, const char *arg, ..., char *const envp[]);int execv(const char *path, char *const argv[]);int execvp(const char *file, char *const argv[]);int execve(const char *path, char *const argv[], char *const envp[]); |
++wait和waitpid
++++立鑽哥哥:一個進程在終止時會關閉所有文件描述符,釋放在用戶空間分配的內存,但它的PCB還保留着,內核在其中保存了一些信息:如果是正常終止則保存着退出狀態,如果是異常終止則保存着導致該進程終止的信號是哪個;這個進程的父進程可以調用wait或waitpid獲取這些信息,然後徹底清除掉這個進程;
++++如果一個進程已經終止,但是它的父進程尚未調用wait或waitpid對它進行清理,這時的進程狀態稱爲殭屍(Zombie)進程;任何進程在剛終止時都是殭屍進程,正常情況下,殭屍進程都立刻被父進程清理了;
pid_t wait(int *status);pid_t waitpid(pit_t pid, int *status, int options); |
++進程間通信
++++立鑽哥哥:每個進程各自有不同的用戶地址空間,任何一個進程的全局變量在另一個進程中都看不到,所以進程之間要交換數據必須通過內核,在內核中開闢一塊緩衝區,進程1把數據從用戶空間拷貝到內核緩衝區,進程2再從內核緩衝區把數據獨奏,內核提供的這種機制稱爲進程間通信(IPC,InterProcess Communication);
++++[管道]:管道是一種最基本的IPC機制,由pipe函數創建;
int pipe(int filedes[2]); |
++A4、Shell腳本
++A5、正則表達式
++A6、信號
++A7、終端、作業控制與守護進程
++A8、線程
++A9、TCP/IP協議基礎
++A10、Socket編程
++A11、立鑽哥哥帶您Linux系統編程
++A4、Shell腳本++A5、正則表達式++A6、信號++A7、終端、作業控制與守護進程++A8、線程++A9、TCP/IP協議基礎++A10、Socket編程++A11、立鑽哥哥帶您Linux系統編程 |
&&Tips:“Linux系統編程”獨立成篇:
++++Linux系統編程:https://blog.csdn.net/VRunSoftYanlz/article/details/104151861
#第二篇:Linux系統下的C開發
#第二篇:Linux系統下的C開發 |
#第二篇:Linux系統下的C開發
++++立鑽哥哥:開發Linux環境下的應用程序時,需要使用大量的Linux函數;這些函數有的屬於Linux操作系統的API,有的屬於C語言的標準庫函數;
++++B1、初級I/O函數
++++B2、文件管理操作函數
++++B3、標準I/O函數
++++B4、格式化輸入輸出函數
++++B5、進程控制
++++B6、進程間通信函數
++++B7、信號函數
++++B8、用戶、組函數及環境變量函數
++++B9、錯誤處理與內存分配函數
++++B10、日誌函數、動態函數與正則表達式函數
++++B11、時間函數
++++B12、socket相關函數
++++B13、字符測試函數
++++B14、數據轉換函數
++++B15、字符串處理函數
++++B16、數學計算函數
++++B17、隨機數及數據加密函數
++++B18、數據結構函數
++++B19、立鑽哥哥整理的其他函數
++++B20、立鑽哥哥帶您Linux系統編程實戰
++B1、初級I/O函數
++B1、初級I/O函數 |
++B1、初級I/O函數
++++立鑽哥哥:計算機由兩個重要的概念:時間和空間;計算機將時間這個概念抽象爲進程,而將空間這個概念抽象爲文件;這些函數實現了Linux環境下的基本文件I/O文件;
++++B1.1、close
++++B1.2、creat
++++B1.3、dup
++++B1.4、dup2
++++B1.5、fcntl
++++B1.6、fsync
++++B1.7、lseek
++++B1.8、open
++++B1.9、read
++++B1.10、sync
++++B1.11、write
++++B1.1、close
++++B1.1、close |
++B1.1、close
++++立鑽哥哥:close函數用來關閉一個已經打開的文件,並且將文件修改過的內容回寫到磁盤;當close函數關閉文件後,該文件佔用的文件描述符則再次可用;
int close(int fd); |
++++close的參數必須是一個文件描述符,不能是一個隨意的整數;由於文件描述符在內核的進程控制結構中實現爲一個文件描述符數組,因此close的參數過大會造成該數組的越界,從而引起系統崩潰;
++++B1.2、creat
++++B1.2、creat |
++B1.2、creat
++++立鑽哥哥:creat函數創建一個新文件,並以“只寫”的方式將這個新創建的文件打開,返回新文件的文件描述符;
int creat(const char *pathname, mode_t mode); |
++++B1.3、dup
++++B1.3、dup |
++B1.3、dup
++++立鑽哥哥:dup函數總是找到進程文件表中第一個可用的文件描述符,將參數指定的文件複製到該描述符後,返回這個描述符;
int dup(int fields); |
++++dup函數總是將複製的文件複製到進程中第一個可用的文件描述符的位置,因此利用這一個特性可以知道進程中最小可用的文件描述符;
++++B1.4、dup2
++++B1.4、dup2 |
++B1.4、dup2
++++立鑽哥哥:dup2函數和dup函數類似,不過dup函數允許使用第二個參數指定將文件描述符複製到哪一個文件描述符上;
int dup2(int filedes, int fileds2); |
++++dup2函數會將指定的目的描述符所代表的文件關閉,之後再進行復制;
++++B1.5、fcntl
++++B1.5、fcntl |
++B1.5、fcntl
++++立鑽哥哥:fcntl函數用來通過文件描述符修改文件的狀態屬性,具體的修改功能由fcntl函數的命令(第二個參數)來決定;
int fcntl(int filedes, int cmd, ...); |
++++fcntl函數相當於一個文件操作的大集合;函數均可用fcntl函數代替;例如dup函數等;
++++B1.6、fsync
++++B1.6、fsync |
++B1.6、fsync
++++立鑽哥哥:fsync函數可以確保文件的實際寫出,該函數會阻塞直到修改的盤塊寫到外存後才返回;
int fsync(int filedes); |
++++fsync函數會將內存中緩衝區中的數據內容回寫到磁盤空間,但是是否會達到實際的回寫效率需要依賴於文件系統的實現;
++++B1.7、lseek
++++B1.7、lseek |
++B1.7、lseek
++++立鑽哥哥:lseek函數可以更改打開文件的偏移量,實現在文件內部的定位;
off_t lseek(int filedes, off_t offset, int whence); |
++++如果lseek函數的第3個參數超過文件本身的長度,會造成一個磁盤文件的空洞;這時該空洞並不佔用磁盤空間;
++++使用“lseek(fd, 0, SEEK_CUR);”,這種方式調用lseek函數可以得到文件當前的偏移位置;
++++B1.8、open
++++B1.8、open |
++B1.8、open
++++立鑽哥哥:open用於打開一個文件;
int open(const char *pathname, int oflag, ...); |
++++open函數的第一個參數指定要打開的文件,有兩種方式指定該文件;使用該文件的絕對路徑名(或者相對路徑名),操作系統將根據路徑名尋找文件;或者使用該文件的文件名,操作系統只在當前工作目錄尋找該文件;
++++open函數可以用來創建一個新文件,因此可以替代creat函數;
++++調用open函數創建一個新文件的時候,該文件的訪問權限受到文件權限屏蔽掩碼“umask”的影響;
++++B1.9、read
++++B1.9、read |
++B1.9、read
++++立鑽哥哥:read函數讀取一個已經打開的文件的內容;
ssize_t read(int filedes, void *buf, size_t nbytes); |
++++read函數不會在讀入的內容後面添加“\0”結束符,這一點和C語言函數庫中提供的讀文件函數是不同的,如果需要的話必須手動添加;
++++B1.10、sync
++++B1.10、sync |
++B1.10、sync
++++立鑽哥哥:sync函數將所有打開的文件回寫到磁盤上;
void sync(void); |
++++sync函數將文件中修改過內容的盤塊放入系統隊列後就返回,並不等待盤塊實際寫入外存;因此該函數能夠加快文件同步速度,但是並不能保證真正的文件同步;
++++B1.11、write
++++B1.11、write |
++B1.11、write
++++立鑽哥哥:write函數輸出內容到一個已經打開的文件中;
ssize_t write(int filedes, void *buf, size_t nbytes); |
++++對於write函數來講,常見的出錯原因是外存沒有足夠的存儲空間或者文件長度超過了進程文件長度的限制;
++B2、文件管理操作函數
++B2、文件管理操作函數 |
++B2、文件管理操作函數
++++立鑽哥哥:在Linux環境下,每一個文件都保存在內核中的stat結構中,該結構保存一個文件的狀態;這些stat結構幾乎包括了一個用戶感興趣的文件所有信息;
++++B2.1、access
++++B2.2、alphasort
++++B2.3、chdir
++++B2.4、chmod
++++B2.5、chown
++++B2.6、chroot
++++B2.7、closedir
++++B2.8、fchdir
++++B2.9、fchmod
++++B2.10、fstat
++++B2.11、ftruncate
++++B2.12、ftw
++++B2.13、get_current_dir_name
++++B2.14、getcwd
++++B2.15、lchown
++++B2.16、link
++++B2.17、lstat
++++B2.18、nftw
++++B2.19、opendir
++++B2.20、readdir
++++B2.21、readlink
++++B2.22、realpath
++++B2.23、remove
++++B2.24、rename
++++B2.25、rewinddir
++++B2.26、seekdir
++++B2.27、stat
++++B2.28、symlink
++++B2.29、telldir
++++B2.30、truncate
++++B2.31、umask
++++B2.32、unlink
++++B2.1、access
++++B2.1、access |
++B2.1、access
++++立鑽哥哥:access函數進行訪問權限測試,測試調用者進程是否有訪問文件的權限;
int access(const char *pathname, int mode); |
++++access函數使用進程的實際用戶ID和實際組ID與文件的所有者ID和ID進行比較;
++++如果進程的實際用戶ID和文件的所有者ID相等,則使用參數mode指定的權限與文件的所有者權限進行比較;
++++B2.2、alphasort
++++B2.2、alphasort |
++B2.2、alphasort
++++立鑽哥哥:alphasort函數按字典序比較兩個目錄項的文件名,並且返回比較結果;
int alphasort(const struct dirent a, const struct dirent b); |
++++alphasort函數的排序方式與strcmp函數相同;
++++B2.3、chdir
++++B2.3、chdir |
++B2.3、chdir
++++立鑽哥哥:chdir函數改變進程的工作目錄;
int chdir(char *pathname); |
++++當進程的工作目錄改變後,所有新創建的文件均在該目錄下,所有程序中引用的相對路徑名也全部以該目錄爲基準開始引用;
++++子進程的工作目錄的改變不影響到父進程,父進程的工作目錄的改變會影響到子進程;
++++B2.4、chmod
++++B2.4、chmod |
++B2.4、chmod
++++立鑽哥哥:chmod函數改變文件的權限,將第二個參數表示的文件權限的標誌位設置到文件的狀態結構中;
int chmod(const char *pathname, mode_t mode); |
++++並不是所有的進程都可以隨便改變文件的權限的,只有文件的所有者和根用戶可以改變文件的權限;這一點體現了系統的安全性;
++++B2.5、chown
++++B2.5、chown |
++B2.5、chown
++++立鑽哥哥:chown函數改變一個文件的所有者的用戶ID;
int chown(const char *pathname, uid_t owner, gid_t group); |
++++更改文件的所有者是一項需要謹慎處理的操作,因爲可能會導致安全問題;因此並不是所有的用戶都可以修改文件的所有者ID的;如果需要修改一個文件的所有者ID和組ID,該用戶必須是根用戶;
++++B2.6、chroot
++++B2.6、chroot |
++B2.6、chroot
++++立鑽哥哥:chroot函數改變進程的根目錄;
int chroot(const char *pathname); |
++++chroot函數的參數表示新的進程根目錄;子進程的根目錄的改變不影響到父進程;相反父進程的根目錄的改變會影響到子進程;
++++B2.7、closedir
++++B2.7、closedir |
++B2.7、closedir
++++立鑽哥哥:closedir函數關閉一個目錄文件,關閉之後則不能再應用該目錄;
int closedir(DIR *dp); |
++++目錄文件作爲一種文件,再打開後必須關閉,否則會由於文件的進程打開文件過多而不能打開新的文件;因此opendir函數和closedir函數是配對出現的;
++++B2.8、fchdir
++++B2.8、fchdir |
++B2.8、fchdir
++++立鑽哥哥:fchdir函數改變進程的工作目錄,目的目錄使用一個文件描述符表示;
int fchdir(int fd); |
++++當進程的工作目錄改變後,所有新創建的文件均在該目錄下,所有程序中引用的相對路徑名也全部以該目錄爲基準開始引用;
++++B2.9、fchmod
++++B2.9、fchmod |
++B2.9、fchmod
++++立鑽哥哥:fchmod函數改變文件的權限,將第二個參數表示的文件權限的標誌位設置到文件的狀態結構中;
int fchmod(int filedes, mode_t mode); |
++++並不是所有的進程都可以隨便改變文件的權限的,只有文件的所有者和根用戶可以改變文件的權限,這一點體現了系統的安全性;fchmod和chmod遵守同樣的規律;
++++B2.10、fstat
++++B2.10、fstat |
++B2.10、fstat
++++立鑽哥哥:fstat函數可以從一個打開文件的文件描述符上得到相關信息,stat結構用於存儲文件的狀態信息;
int fstat(int filedes, struct stat *restrict buf);
|
//立鑽哥哥:fstat函數從內核中取得文件的狀態並且將其存儲在參數buf所表示的stat結構中返回給用戶;stat結構用於存儲文件的狀態信息; //stat結構,聲明於sys/stat.h文件之中 struct stat{ mode_t st_mode; //文件類型和文件權限,兩個成員作爲一個位向量存儲 ino_t st_ino; //i節點號 dev_t st_dev; //文件系統設備號 dev_t st_rdev; //硬件設備設備號 nlink_t st_nlink; //硬鏈接數 uid_t st_uid; //所有者用戶ID gid_t st_gid; //所有者組ID off_t st_size; //文件的大小(字節數,只對於普通文件有效) time_t st_atime; //最近一次的訪問時間 time_t st_mtime; //最近一次修改文件內容的時間 time_t st_ctime; //最近一次修改文件屬性的時間 blksize_t st_blksie; //最合適的緩衝區大小 blkcnt_t st_blocks; //文件在外存上佔用的盤塊數 }; |
++++Linux環境下的文件都有自己的狀態信息,例如文件的大小和文件的修改日期等,這些狀態信息和文件的內容是分開存儲的;
++++B2.11、ftruncate
++++B2.11、ftruncate |
++B2.11、ftruncate
++++立鑽哥哥:ftruncate函數改變一個已經打開的文件的大小,如果新的大小小於文件的原大小,則放棄超出的部分;
int ftruncate(const char *pathname, off_t length); |
++++ftruncate函數的第二個參數表示將文件截短的字節數,超過這個字節數的部分將被系統放棄;如果文件的實際大小小於這個指定的值,則系統會自動拓展該文件;這時文件實際末尾和拓展的新末尾之間形成一個文件空洞;
++++B2.12、ftw
++++B2.12、ftw |
++B2.12、ftw
++++立鑽哥哥:ftw函數從參數dir指定的目錄開始,一層層地遞歸遍歷子目錄;每進入一個目錄,便會調用參數*fn定義的函數來處理;
int ftw(const char *dir, int (*fn)(const char *file, const struct stat *sb, int flag), int depth); |
++++ftw函數用來遍歷一個樹形目錄,對每一個子目錄下的文件使用回調函數進行操作;
++++B2.13、get_current_dir_name
++++B2.13、get_current_dir_name |
++B2.13、get_current_dir_name
++++立鑽哥哥:get_current_dir_name函數得到進程的當前工作目錄,並且將這個目錄的字符串形式存儲在系統分配的空間中;
char *get_current_dir_name(); |
++++get_current_dir_name函數分配一塊內存保存當前路徑的字符串形式,系統會自動添加一個’\0’結束標誌;
++++B2.14、getcwd
++++B2.14、getcwd |
++B2.14、getcwd
++++立鑽哥哥:getcwd函數得到進程的當前工作目錄,並且將這個目錄的字符串形式存儲在用戶提供的緩衝區中;
char *getcwd(char *buf, size_t size); |
++++getcwd函數的第二個參數是存儲當前目錄字符串形式的緩衝區,該緩衝區可以容納路徑名的字符數加上一個’\0’結束符的長度;
++++B2.15、lchown
++++B2.15、lchown |
++B2.15、lchown
++++立鑽哥哥:lchown函數改變符號鏈接文件本身的所有者;
int lchown(const char *pathname, uid_t owner, gid_t group); |
++++B2.16、link
++++B2.16、link |
++B2.16、link
++++立鑽哥哥:link函數創建一個新的目錄項,這個目錄項使用參數newpath所表示的路徑的最末端作爲文件的文件名;
int link(const char *exitingpath, const char *newpath); |
++++Linux文件系統並不允許普通用戶創建一個鏈接到目錄的硬鏈接;因爲這樣會導致文件系統的目錄屬性結構中出現迴路;根用戶可以創建鏈接到目錄的硬鏈接,但是這種操作應該杜絕;
++++一個文件可以對應多個目錄項,也就是說多個不同名的文件可以具有相同的文件內容,因爲它們都對應同一個磁盤文件;當一個磁盤文件沒有目錄項相對應時,這個文件將不能被系統所引用;因此當該文件不再處於打開狀態時,系統也將刪除該文件;
++++B2.17、lstat
++++B2.17、lstat |
++B2.17、lstat
++++立鑽哥哥:lstat函數不跟蹤符號鏈接,因此可以取得符號鏈接文件本身的文件狀態信息;
int lstat(const char *restrict pathname, struct stat *restrict buf); |
++++Linux環境下的每一個文件都有自己的狀態信息,狀態信息和文件的內容是分開存儲的,符號鏈接也是一樣;
++++B2.18、nftw
++++B2.18、nftw |
++B2.18、nftw
++++立鑽哥哥:nftw函數從參數dir指定的目錄開始,一層層地遞歸遍歷子目錄;每進入一個目錄,便會調用參數*fn定義的函數來處理;
int nftw(const char *dir, int (*fn)(const char *file, const struct stat *sb, int flag, struct FTW *s), int depth, int flags); |
++++nftw函數用來遍歷一個樹形目錄,對每一個子目錄下的文件使用回調函數進行操作;
++++B2.19、opendir
++++B2.19、opendir |
++B2.19、opendir
++++立鑽哥哥:opendir函數打開一個目錄文件,之後可以像操作普通文件一樣操作該文件;
DIR *opendir(const char *pathname); |
++++目錄文件作爲一種文件,在打開後必須關閉,否則會造成文件的進程打開文件過多而不能打開新的文件,因此opendir和closedir是配對出現的;
++++B2.20、readdir
++++B2.20、readdir |
++B2.20、readdir
++++立鑽哥哥:readdir函數讀取目錄中每一個文件的目錄項,並將其返回;子目錄作爲文件的一種,同樣會返回目錄項;
struct direct *readdir(DIR *dp); |
++++readdir函數返回讀取的文件的目錄項,如果目錄到達結尾或者出錯readdir函數返回NULL;因此判斷readdir函數是否出錯應當判斷errno變量的值;
++++B2.21、readlink
++++B2.21、readlink |
++B2.21、readlink
++++立鑽哥哥:readlink函數讀取符號鏈接的鏈接名,並且存入buf緩衝區中;
int readlink(const char *restrict pathname, char *restrict buf, size_t bufsize); |
++++readlink函數讀取符號鏈接的鏈接名,並且存入buf緩衝區中;readlink函數不讀取符號鏈接所指向的文件的內容,這一點要特別注意;buf緩衝區中的字符串不以’\0’結尾,如果需要,用戶應當自行添加;
++++B2.22、realpath
++++B2.22、realpath |
++B2.22、realpath
++++立鑽哥哥:realpath函數將一個相對路徑轉換爲絕對路徑後返回;
char *realpath(const char *path); |
++++realpath函數轉換相對路徑,將結果保存在一塊分配的存儲區中,在使用之後應當將其釋放;
++++B2.23、remove
++++B2.23、remove |
++B2.23、remove
++++立鑽哥哥:remove函數的參數pathname表示要刪除的文件或目錄;
int remove(const char *pathname); |
++++目錄文件作爲一種文件,其內部存儲文件的目錄項;每次讀目錄文件實際上跳過一個目錄項的大小;
++++B2.24、rename
++++B2.24、rename |
++B2.24、rename
++++立鑽哥哥:rename函數將原始路徑表示的文件移動到新的路徑上,因此可以實現文件的改名或者文件的移動;
int rename(const char *oldpath, const char *newpath); |
++++rename函數會將參數oldpath所指定的文件名稱改爲參數newpath所指的文件名稱;若newpath所指定的文件已存在,則會被刪除;
++++B2.25、rewinddir
++++B2.25、rewinddir |
++B2.25、rewinddir
++++立鑽哥哥:rewinddir函數將一個目錄的當前讀寫位置回到目錄文件的開始處,這個操作稱爲回捲;
void rewinddir(DIR *dir); |
++++目錄文件作爲一種文件,其內部存儲文件的目錄項;每次讀目錄文件實際上跳過一個目錄項的大小;因此目錄文件也可以回捲;
++++B2.26、seekdir
++++B2.26、seekdir |
++B2.26、seekdir
++++立鑽哥哥:seekdir函數在目錄文件中定位,可以將目錄文件當作普通文件一樣指定文件內的讀寫位置;
void seekdir(DIR *dir, off_t offset); |
++++目錄文件作爲一種文件,其內部存儲文件的目錄項;每次讀目錄文件實際上跳過一個目錄項的大小;因此目錄文件也可以進行定位,人工地設定目錄文件的讀寫位置;
++++B2.27、stat
++++B2.27、stat |
++B2.27、stat
++++立鑽哥哥:stat函數得到文件的相關狀態信息,stat結構用於存儲文件的狀態信息;
int stat(const char *restrict pathname, struct stat *restrict buf); |
++++Linux環境下文件的狀態信息和文件的內容是分開存儲的;
++++B2.28、symlink
++++B2.28、symlink |
++B2.28、symlink
++++立鑽哥哥:symlink函數創建一個新的目錄項sympath,並且使該目錄項指向actualpath所表示的文件的目錄項;
int symlink(const char *actualpath, const char *sympath); |
++++symlink函數創建一個符號鏈接,當讀取該符號鏈接時實際上讀取的是符號鏈接所指向的目的文件的內容;寫操作的道理是一樣的;如果希望讀取符號鏈接,文件本身應當使用專門的系統函數;
++++B2.29、telldir
++++B2.29、telldir |
++B2.29、telldir
++++立鑽哥哥:telldir函數返回參數所表示的目錄文件目前的讀取位置;
off_t telldir(DIR *dir); |
++++使用telldir函數只能夠得到目錄文件的讀取位置,不能得到目錄文件的寫位置;只是由於目錄文件本身並不是可寫的,這一點和普通文件是不一樣的;只有系統可以寫一個目錄文件;
++++B2.30、truncate
++++B2.30、truncate |
++B2.30、truncate
++++立鑽哥哥:truncate函數改變一個文件的大小,如果新的大小小於文件的原大小,則放棄超出的部分;
int truncate(const char *pathname, off_t length); |
++++truncate函數的第二個參數表示將文件截短的字節數,超過這個字節數的部分將被系統放棄;如果文件的實際大小小於這個指定的值,則系統會自動拓展該文件;這時文件實際末尾和拓展的新末尾之間形成一個文件空洞;
++++B2.31、umask
++++B2.31、umask |
++B2.31、umask
++++立鑽哥哥:umask函數設置創建文件時使用的權限掩碼;mode_t類型也是一個位向量,對應9個權限標誌位;哪一位的屏蔽位爲1,說明用戶在創建文件時所指定的權限標誌無效,新文件不具有該權限;爲0則相反,是否具有該權限,取決於用戶的權限字;
mode_t umask(mode_t cmask); |
++++運行的mask程序時Shell進程的子進程,子進程改變父進程的環境,從安全的角度來講是不應該的;因此umask函數更改進程環境下的創建文件時使用的權限掩碼並不影響父進程;
++++B2.32、unlink
++++B2.32、unlink |
++B2.32、unlink
++++立鑽哥哥:unlink函數將pathname最末端的目錄項刪除,並且將該目錄項所對應的的磁盤文件的鏈接數鍵1;
int unlink(const char *pathname); |
++++使用unlink函數應當注意,即使一個文件的鏈接數已經爲0,只要該文件打開,程序仍可以引用該文件;包括對文件的讀和寫,不過這時的讀寫操作實際上是在對內存中緩衝區進行操作;當文件被關閉時,內存中的緩衝區消失,文件也就消失了;
++B3、標準I/O函數
++B3、標準I/O函數 |
++B3、標準I/O函數
++++立鑽哥哥:Linux/UNIX下的I/O函數主要使用在磁盤文件操作上,以及標準I/O文件(標準輸出,標準輸入等);系統中同時還爲臨時數據文件提供了一些相應的操作函數;
++++B3.1、clearerr
++++B3.2、fclose
++++B3.3、fdopen
++++B3.4、feof
++++B3.5、fflush
++++B3.6、fgetc
++++B3.7、fgetpos
++++B3.8、fgets
++++B3.9、fileno
++++B3.10、fopen
++++B3.11、fputc
++++B3.12、fputs
++++B3.13、fread
++++B3.14、freopen
++++B3.15、fseek
++++B3.16、fsetpos
++++B3.17、ftell
++++B3.18、fwrite
++++B3.19、getc
++++B3.20、getchar
++++B3.21、gets
++++B3.22、mktemp
++++B3.23、putc
++++B3.24、putchar
++++B3.25、puts
++++B3.26、rewind
++++B3.27、setbuf
++++B3.28、setbuffer
++++B3.29、setlinebuf
++++B3.30、setvbuf
++++B3.31、tmpfile
++++B3.32、ungetc
&&Tips:這篇博文暫時拓展到這裏了,有些不捨,但必須中斷了,有興趣的可以查看以下鏈接拓展:
++++【C/C++函數與算法(C庫獨立篇)】:https://blog.csdn.net/VRunSoftYanlz/article/details/104026090
++++【Linux系統編程】分類:https://blog.csdn.net/vrunsoftyanlz/category_9694767.html
++++【C++C鑄就生存利器】分類:https://blog.csdn.net/vrunsoftyanlz/category_9325802.html
++++【人工智能AI2026】分類:https://blog.csdn.net/vrunsoftyanlz/category_9212024.html
++++【立鑽哥哥CSDN空間】:https://blog.csdn.net/VRunSoftYanlz/
++++VR雲遊戲=Unity+SteamVR+雲技術+5G+AI;(說明:AI人工智能不是我們的主要研究技術,只是瞭解一下,領略一下有風的感覺!但是,VR是我們的研究重點)
++++【Linux系統編程】分類:https://blog.csdn.net/vrunsoftyanlz/category_9694767.html
++++【Linux從入門到放棄】:https://blog.csdn.net/VRunSoftYanlz/article/details/104176967
++++【Linux C函數與算法】:https://blog.csdn.net/VRunSoftYanlz/article/details/104076473
++++【Linux系統編程】:https://blog.csdn.net/VRunSoftYanlz/article/details/104151861
++++【Linux內核API】:https://blog.csdn.net/VRunSoftYanlz/article/details/104189074
++++【Linux內核剖析】:https://blog.csdn.net/VRunSoftYanlz/article/details/104200535
++++【C++C鑄就生存利器】分類:https://blog.csdn.net/vrunsoftyanlz/category_9325802.html
++++【人工智能AI2026】分類:https://blog.csdn.net/vrunsoftyanlz/category_9212024.html
++++【立鑽哥哥CSDN空間】:https://blog.csdn.net/VRunSoftYanlz/
【XR遊戲開發QQ羣:784477094】
++立鑽哥哥推薦的拓展學習鏈接(Link_Url):
立鑽哥哥推薦的拓展學習鏈接(Link_Url) |
++++立鑽哥哥Unity 學習空間: http://blog.csdn.net/VRunSoftYanlz/
++++虛擬現實VR資訊: https://blog.csdn.net/VRunSoftYanlz/article/details/89165846
++++HTC_VIVE開發基礎:https://blog.csdn.net/VRunSoftYanlz/article/details/81989970
++++Oculus雜談:https://blog.csdn.net/VRunSoftYanlz/article/details/82469850
++++Oculus安裝使用:https://blog.csdn.net/VRunSoftYanlz/article/details/82718982
++++Unity+SteamVR=>VR:https://blog.csdn.net/VRunSoftYanlz/article/details/88809370
++++Unity減少VR暈眩症:https://blog.csdn.net/VRunSoftYanlz/article/details/89115518
++++SteamVR簡介:https://blog.csdn.net/VRunSoftYanlz/article/details/86484254
++++SteamVR腳本功能分析:https://blog.csdn.net/VRunSoftYanlz/article/details/86531480
++++SteamVR2.0開發指南:https://blog.csdn.net/VRunSoftYanlz/article/details/86618187
++++SteamVR2.2.0開發指南:https://blog.csdn.net/VRunSoftYanlz/article/details/88784527
++++SteamVR2.2.0快速入門:https://blog.csdn.net/VRunSoftYanlz/article/details/88833579
++++SteamVR2.2.0交互系統:https://blog.csdn.net/VRunSoftYanlz/article/details/89199778
++++SteamVR2.2.0傳送機制:https://blog.csdn.net/VRunSoftYanlz/article/details/89390866
++++SteamVR2.2.0教程(一):https://blog.csdn.net/VRunSoftYanlz/article/details/89324067
++++SteamVR2.2.0教程(二):https://blog.csdn.net/VRunSoftYanlz/article/details/89894097
++++SteamVR_Skeleton_Poser:https://blog.csdn.net/VRunSoftYanlz/article/details/89931725
++++SteamVR實戰之PMCore:https://blog.csdn.net/VRunSoftYanlz/article/details/89463658
++++SteamVR/Extras:https://blog.csdn.net/VRunSoftYanlz/article/details/86584108
++++SteamVR/Input:https://blog.csdn.net/VRunSoftYanlz/article/details/86601950
++++OpenXR簡介:https://blog.csdn.net/VRunSoftYanlz/article/details/85726365
++++VRTK雜談:https://blog.csdn.net/VRunSoftYanlz/article/details/82562993
++++VRTK快速入門(雜談):https://blog.csdn.net/VRunSoftYanlz/article/details/82955267
++++VRTK官方示例(目錄):https://blog.csdn.net/VRunSoftYanlz/article/details/82955410
++++VRTK代碼結構(目錄):https://blog.csdn.net/VRunSoftYanlz/article/details/82780085
++++VRTK(SceneResources):https://blog.csdn.net/VRunSoftYanlz/article/details/82795400
++++VRTK_ControllerEvents:https://blog.csdn.net/VRunSoftYanlz/article/details/83099512
++++VRTK_InteractTouch:https://blog.csdn.net/VRunSoftYanlz/article/details/83120220
++++虛擬現實行業應用:https://blog.csdn.net/VRunSoftYanlz/article/details/88360157
++++Steam平臺上的VR:https://blog.csdn.net/VRunSoftYanlz/article/details/88960085
++++Steam平臺熱銷VR:https://blog.csdn.net/VRunSoftYanlz/article/details/89007741
++++VR實驗:以太網幀的構成:https://blog.csdn.net/VRunSoftYanlz/article/details/82598140
++++實驗四:存儲器擴展實驗:https://blog.csdn.net/VRunSoftYanlz/article/details/87834434
++++FrameVR示例V0913:https://blog.csdn.net/VRunSoftYanlz/article/details/82808498
++++FrameVR示例V1003:https://blog.csdn.net/VRunSoftYanlz/article/details/83066516
++++SwitchMachineV1022:https://blog.csdn.net/VRunSoftYanlz/article/details/83280886
++++PlaySceneManagerV1022:https://blog.csdn.net/VRunSoftYanlz/article/details/83280886
++++Unity5.x用戶手冊:https://blog.csdn.net/VRunSoftYanlz/article/details/81712741
++++Unity面試題ABC:https://blog.csdn.net/vrunsoftyanlz/article/details/78630687
++++Unity面試題D:https://blog.csdn.net/VRunSoftYanlz/article/details/78630838
++++Unity面試題E:https://blog.csdn.net/vrunsoftyanlz/article/details/78630913
++++Unity面試題F:https://blog.csdn.net/VRunSoftYanlz/article/details/78630945
++++Cocos2dx面試題:https://blog.csdn.net/VRunSoftYanlz/article/details/78630967
++++禪道[zentao]:https://blog.csdn.net/VRunSoftYanlz/article/details/83964057
++++Lua快速入門篇(Xlua拓展):https://blog.csdn.net/VRunSoftYanlz/article/details/81173818
++++Lua快速入門篇(XLua教程):https://blog.csdn.net/VRunSoftYanlz/article/details/81141502
++++Lua快速入門篇(基礎概述):https://blog.csdn.net/VRunSoftYanlz/article/details/81041359
++++框架知識點:https://blog.csdn.net/VRunSoftYanlz/article/details/80862879
++++遊戲框架(UI框架夯實篇):https://blog.csdn.net/vrunsoftyanlz/article/details/80781140
++++遊戲框架(初探篇):https://blog.csdn.net/VRunSoftYanlz/article/details/80630325
++++.Net框架設計:https://blog.csdn.net/VRunSoftYanlz/article/details/87401225
++++從零開始學架構:https://blog.csdn.net/VRunSoftYanlz/article/details/88095895
++++設計模式簡單整理:https://blog.csdn.net/vrunsoftyanlz/article/details/79839641
++++專題:設計模式(精華篇):https://blog.csdn.net/VRunSoftYanlz/article/details/81322678
++++U3D小項目參考:https://blog.csdn.net/vrunsoftyanlz/article/details/80141811
++++Unity小遊戲算法分析:https://blog.csdn.net/VRunSoftYanlz/article/details/87908365
++++Unity案例(Vehicle):https://blog.csdn.net/VRunSoftYanlz/article/details/82355876
++++UML類圖:https://blog.csdn.net/vrunsoftyanlz/article/details/80289461
++++PowerDesigner簡介:https://blog.csdn.net/VRunSoftYanlz/article/details/86500084
++++Unity知識點0001:https://blog.csdn.net/vrunsoftyanlz/article/details/80302012
++++Unity知識點0008:https://blog.csdn.net/VRunSoftYanlz/article/details/81153606
++++U3D_Shader編程(第一篇:快速入門篇):https://blog.csdn.net/vrunsoftyanlz/article/details/80372071
++++U3D_Shader編程(第二篇:基礎夯實篇):https://blog.csdn.net/vrunsoftyanlz/article/details/80372628
++++Unity引擎基礎:https://blog.csdn.net/vrunsoftyanlz/article/details/78881685
++++Unity面向組件開發:https://blog.csdn.net/vrunsoftyanlz/article/details/78881752
++++Unity物理系統:https://blog.csdn.net/vrunsoftyanlz/article/details/78881879
++++Unity2D平臺開發:https://blog.csdn.net/vrunsoftyanlz/article/details/78882034
++++UGUI基礎:https://blog.csdn.net/vrunsoftyanlz/article/details/78884693
++++UGUI進階:https://blog.csdn.net/vrunsoftyanlz/article/details/78884882
++++UGUI綜合:https://blog.csdn.net/vrunsoftyanlz/article/details/78885013
++++Unity動畫系統基礎:https://blog.csdn.net/vrunsoftyanlz/article/details/78886068
++++Unity動畫系統進階:https://blog.csdn.net/vrunsoftyanlz/article/details/78886198
++++Navigation導航系統:https://blog.csdn.net/vrunsoftyanlz/article/details/78886281
++++Unity特效渲染:https://blog.csdn.net/vrunsoftyanlz/article/details/78886403
++++Unity數據存儲:https://blog.csdn.net/vrunsoftyanlz/article/details/79251273
++++Unity中Sqlite數據庫:https://blog.csdn.net/vrunsoftyanlz/article/details/79254162
++++WWW類和協程:https://blog.csdn.net/vrunsoftyanlz/article/details/79254559
++++Unity網絡:https://blog.csdn.net/vrunsoftyanlz/article/details/79254902
++++Unity資源加密:https://blog.csdn.net/VRunSoftYanlz/article/details/87644514
++++PhotonServer簡介:https://blog.csdn.net/VRunSoftYanlz/article/details/86652770
++++編寫Photon遊戲服務器:https://blog.csdn.net/VRunSoftYanlz/article/details/86682935
++++C#事件:https://blog.csdn.net/vrunsoftyanlz/article/details/78631267
++++C#委託:https://blog.csdn.net/vrunsoftyanlz/article/details/78631183
++++C#集合:https://blog.csdn.net/vrunsoftyanlz/article/details/78631175
++++C#泛型:https://blog.csdn.net/vrunsoftyanlz/article/details/78631141
++++C#接口:https://blog.csdn.net/vrunsoftyanlz/article/details/78631122
++++C#靜態類:https://blog.csdn.net/vrunsoftyanlz/article/details/78630979
++++C#中System.String類:https://blog.csdn.net/vrunsoftyanlz/article/details/78630945
++++C#數據類型:https://blog.csdn.net/vrunsoftyanlz/article/details/78630913
++++Unity3D默認的快捷鍵:https://blog.csdn.net/vrunsoftyanlz/article/details/78630838
++++遊戲相關縮寫:https://blog.csdn.net/vrunsoftyanlz/article/details/78630687
++++UnityAPI.Rigidbody剛體:https://blog.csdn.net/VRunSoftYanlz/article/details/81784053
++++UnityAPI.Material材質:https://blog.csdn.net/VRunSoftYanlz/article/details/81814303
++++UnityAPI.Android安卓:https://blog.csdn.net/VRunSoftYanlz/article/details/81843193
++++UnityAPI.AndroidJNI安卓JNI:https://blog.csdn.net/VRunSoftYanlz/article/details/81879345
++++UnityAPI.Transform變換:https://blog.csdn.net/VRunSoftYanlz/article/details/81916293
++++UnityAPI.WheelCollider輪碰撞器:https://blog.csdn.net/VRunSoftYanlz/article/details/82356217
++++UnityAPI.Resources資源:https://blog.csdn.net/VRunSoftYanlz/article/details/83155518
++++JSON數據結構:https://blog.csdn.net/VRunSoftYanlz/article/details/82026644
++++CocosStudio快速入門:https://blog.csdn.net/VRunSoftYanlz/article/details/82356839
++++Unity企業內訓(目錄):https://blog.csdn.net/VRunSoftYanlz/article/details/82634668
++++Unity企業內訓(第1講):https://blog.csdn.net/VRunSoftYanlz/article/details/82634733
++++Unity企業內訓(第2講):https://blog.csdn.net/VRunSoftYanlz/article/details/82861180
++++Unity企業內訓(第3講):https://blog.csdn.net/VRunSoftYanlz/article/details/82927699
++++Unity企業內訓(第4講):https://blog.csdn.net/VRunSoftYanlz/article/details/83479776
++++Unity企業內訓(第5講):https://blog.csdn.net/VRunSoftYanlz/article/details/83963811
++++Unity企業內訓(第6講):https://blog.csdn.net/VRunSoftYanlz/article/details/84207696
++++鑽哥帶您瞭解產品原型:https://blog.csdn.net/VRunSoftYanlz/article/details/87303828
++++插件<Obi Rope>:https://blog.csdn.net/VRunSoftYanlz/article/details/83963905
++++計算機組成原理(教材篇):https://blog.csdn.net/VRunSoftYanlz/article/details/82719129
++++5G接入:雲計算和霧計算:https://blog.csdn.net/VRunSoftYanlz/article/details/88372718
++++雲計算通俗講義:https://blog.csdn.net/VRunSoftYanlz/article/details/88652803
++++立鑽哥哥Unity 學習空間: http://blog.csdn.net/VRunSoftYanlz/
--_--VRunSoft:lovezuanzuan--_--