C語言在linux下編程詳解
文件操作
#include <sys/unistd.h> //含有close函數(shù) #include <fcntl.h> //含有open函數(shù) int main(){ int fd=open("text.txt",O_RDONLY); close(fd); } //O_RDONLY是一個宏,代表這個文件只讀,常用的就是這三個 #define O_RDONLY 00 //只讀 #define O_WRONLY 01 //只寫 #define O_RDWR 02 //讀寫都可以
上述的代碼打開了一個文件,隨即又關(guān)上了。那個int類型的變量fd叫做文件描述符(file descriptor)。用一個數(shù)字代表一個對象,這是C語言常見的設(shè)計(jì)模式,OpenGL的實(shí)現(xiàn)也是類似。
它的底層一般是這樣的:真正操作的對象是一個復(fù)雜的結(jié)構(gòu)體,這些對象存放在一個數(shù)組中,而數(shù)字代表真實(shí)對象在數(shù)組中的索引值。
在open和 close之間,當(dāng)然要進(jìn)行一些讀寫操作,示例如下:
#include <sys/unistd.h> #include <fcntl.h> int main(){ int fd=open("test.txt",O_WRONLY); write(fd,"hello world",11); //向文件中寫入了hello world close(fd); }
看到這,你可能覺得不屑一顧,這和<stdio.h>不是差不多嘛。別急啊兄弟,這個fd可不僅僅代表通常意義的文件,Linux的其中一個設(shè)計(jì)哲學(xué)是:一切皆文件。讓我們列舉一下這個fd能代表什么:
1.文本文件和二進(jìn)制文件(這兩叫普通文件)
2.目錄文件(可以理解為文件夾)
3.字符設(shè)備和塊設(shè)備(例如網(wǎng)卡和硬盤)
4.套接字(實(shí)現(xiàn)網(wǎng)絡(luò)通信的接口,讀寫它相當(dāng)于網(wǎng)絡(luò)通信)
5.符號鏈接(類似于windows桌面上的快捷方式)
6.管道(用于進(jìn)程通信)
上面這個表你可能記不住,但是我相信你體會到了它的強(qiáng)大。下面是一個向控制臺打印字符串的例子。
#include <sys/unistd.h> #include <fcntl.h> int main(){ write(STDOUT_FILENO,"hello world",11); } //上面的STDOUT_FILENO是一個宏,表示標(biāo)準(zhǔn)輸出,它們的定義是這樣的: #define STDIN_FILENO 0 /* Standard input. */ #define STDOUT_FILENO 1 /* Standard output. */ #define STDERR_FILENO 2 /* Standard error output. */
因?yàn)?,1,2都已經(jīng)被占用了,所以我們的fd是從3開始的,如果出錯(如文件不存在)則會返回一個負(fù)數(shù)。維護(hù)fd的數(shù)組在表示進(jìn)程的結(jié)構(gòu)體中,所以fd只在它所在的進(jìn)程有意義。不同的進(jìn)程可以有相同的fd
雖然統(tǒng)一的fd設(shè)計(jì)的非常好,但是它并不能讓我們看到文件的容量、修改日期等信息。所以還有其他函數(shù)供我們使用。
//需包含<sys/stat.h>頭文件,其詳細(xì)內(nèi)容如下所示 int stat (const char *file_name,struct stat *buf); struct stat { dev_t st_dev; /* ID of device containing file */文件使用的設(shè)備號 ino_t st_ino; /* inode number */ 索引節(jié)點(diǎn)號 mode_t st_mode; /* protection */ 文件對應(yīng)的模式,文件,目錄等 nlink_t st_nlink; /* number of hard links */ 文件的硬連接數(shù) uid_t st_uid; /* user ID of owner */ 所有者用戶識別號 gid_t st_gid; /* group ID of owner */ 組識別號 dev_t st_rdev; /* device ID (if special file) */ 設(shè)備文件的設(shè)備號 off_t st_size; /* total size, in bytes */ 以字節(jié)為單位的文件容量 blksize_t st_blksize; /* blocksize for file system I/O */ 包含該文件的磁盤塊的大小 blkcnt_t st_blocks; /* number of 512B blocks allocated */ 該文件所占的磁盤塊 time_t st_atime; /* time of last access */ 最后一次訪問該文件的時間 time_t st_mtime; /* time of last modification */ /最后一次修改該文件的時間 time_t st_ctime; /* time of last status change */ 最后一次改變該文件狀態(tài)的時間 };
總結(jié)
本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
QT+ffmpeg實(shí)現(xiàn)視頻解析的示例詳解
這篇文章主要為大家詳細(xì)介紹了如何利用QT+ffmpeg實(shí)現(xiàn)視頻解析功能,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Qt有一定幫助,需要的可以參考一下2022-09-09C++中4種管理數(shù)據(jù)內(nèi)存的方式總結(jié)
根據(jù)用于分配內(nèi)存的方法,C++中有3中管理數(shù)據(jù)內(nèi)存的方式:自動存儲、靜態(tài)存儲和動態(tài)存儲。在存在時間的長短方面,以這三種方式分配的數(shù)據(jù)對象各不相同。下面簡要介紹這三種類型2022-09-09C語言中操作sqlserver數(shù)據(jù)庫案例教程
這篇文章主要介紹了C語言中操作sqlserver數(shù)據(jù)庫案例教程,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07QT中窗口關(guān)閉自動銷毀的實(shí)現(xiàn)示例
這篇文章主要介紹了QT中窗口關(guān)閉自動銷毀,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05