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è)計模式,OpenGL的實現(xiàn)也是類似。
它的底層一般是這樣的:真正操作的對象是一個復(fù)雜的結(jié)構(gòu)體,這些對象存放在一個數(shù)組中,而數(shù)字代表真實對象在數(shù)組中的索引值。
在open和 close之間,當(dāng)然要進行一些讀寫操作,示例如下:
#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è)計哲學(xué)是:一切皆文件。讓我們列舉一下這個fd能代表什么:
1.文本文件和二進制文件(這兩叫普通文件)
2.目錄文件(可以理解為文件夾)
3.字符設(shè)備和塊設(shè)備(例如網(wǎng)卡和硬盤)
4.套接字(實現(xiàn)網(wǎng)絡(luò)通信的接口,讀寫它相當(dāng)于網(wǎng)絡(luò)通信)
5.符號鏈接(類似于windows桌面上的快捷方式)
6.管道(用于進程通信)
上面這個表你可能記不住,但是我相信你體會到了它的強大。下面是一個向控制臺打印字符串的例子。
#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. */
因為0,1,2都已經(jīng)被占用了,所以我們的fd是從3開始的,如果出錯(如文件不存在)則會返回一個負數(shù)。維護fd的數(shù)組在表示進程的結(jié)構(gòu)體中,所以fd只在它所在的進程有意義。不同的進程可以有相同的fd
雖然統(tǒng)一的fd設(shè)計的非常好,但是它并不能讓我們看到文件的容量、修改日期等信息。所以還有其他函數(shù)供我們使用。
//需包含<sys/stat.h>頭文件,其詳細內(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é)點號
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)文章
分享一下8年C++面向?qū)ο笤O(shè)計的經(jīng)驗體會
關(guān)于C++程序設(shè)計的書藉非常多,本章不講C++的語法,只講一些小小的編程道理。如果我能早幾年明白這些小道理,就可以大大改善數(shù)十萬行程序的質(zhì)量了2017-07-07
C++程序的執(zhí)行順序結(jié)構(gòu)以及關(guān)系和邏輯運算符講解
這篇文章主要介紹了C++程序的執(zhí)行順序結(jié)構(gòu)以及關(guān)系和邏輯運算符講解,是C++入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下2015-09-09
淺談內(nèi)聯(lián)函數(shù)與宏定義的區(qū)別詳解
本篇文章是對內(nèi)聯(lián)函數(shù)與宏定義的區(qū)別進行了詳細的分析介紹,需要的朋友參考下2013-05-05
C語言 volatile與const同時使用應(yīng)注意的問題
“volatile”的含義是“請不要做沒譜的優(yōu)化,這個值可能變掉的”,而并非“你可以修改這個值”。因此,它們本來就不是矛盾的2013-09-09

