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是一個(gè)宏,代表這個(gè)文件只讀,常用的就是這三個(gè)
#define O_RDONLY 00 //只讀
#define O_WRONLY 01 //只寫
#define O_RDWR 02 //讀寫都可以
上述的代碼打開了一個(gè)文件,隨即又關(guān)上了。那個(gè)int類型的變量fd叫做文件描述符(file descriptor)。用一個(gè)數(shù)字代表一個(gè)對(duì)象,這是C語言常見的設(shè)計(jì)模式,OpenGL的實(shí)現(xiàn)也是類似。
它的底層一般是這樣的:真正操作的對(duì)象是一個(gè)復(fù)雜的結(jié)構(gòu)體,這些對(duì)象存放在一個(gè)數(shù)組中,而數(shù)字代表真實(shí)對(duì)象在數(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>不是差不多嘛。別急啊兄弟,這個(gè)fd可不僅僅代表通常意義的文件,Linux的其中一個(gè)設(shè)計(jì)哲學(xué)是:一切皆文件。讓我們列舉一下這個(gè)fd能代表什么:
1.文本文件和二進(jìn)制文件(這兩叫普通文件)
2.目錄文件(可以理解為文件夾)
3.字符設(shè)備和塊設(shè)備(例如網(wǎng)卡和硬盤)
4.套接字(實(shí)現(xiàn)網(wǎng)絡(luò)通信的接口,讀寫它相當(dāng)于網(wǎng)絡(luò)通信)
5.符號(hào)鏈接(類似于windows桌面上的快捷方式)
6.管道(用于進(jìn)程通信)
上面這個(gè)表你可能記不住,但是我相信你體會(huì)到了它的強(qiáng)大。下面是一個(gè)向控制臺(tái)打印字符串的例子。
#include <sys/unistd.h>
#include <fcntl.h>
int main(){
write(STDOUT_FILENO,"hello world",11);
}
//上面的STDOUT_FILENO是一個(gè)宏,表示標(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開始的,如果出錯(cuò)(如文件不存在)則會(huì)返回一個(gè)負(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è)備號(hào)
ino_t st_ino; /* inode number */ 索引節(jié)點(diǎn)號(hào)
mode_t st_mode; /* protection */ 文件對(duì)應(yīng)的模式,文件,目錄等
nlink_t st_nlink; /* number of hard links */ 文件的硬連接數(shù)
uid_t st_uid; /* user ID of owner */ 所有者用戶識(shí)別號(hào)
gid_t st_gid; /* group ID of owner */ 組識(shí)別號(hào)
dev_t st_rdev; /* device ID (if special file) */ 設(shè)備文件的設(shè)備號(hào)
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 */ 最后一次訪問該文件的時(shí)間
time_t st_mtime; /* time of last modification */ /最后一次修改該文件的時(shí)間
time_t st_ctime; /* time of last status change */ 最后一次改變?cè)撐募顟B(tài)的時(shí)間
};
總結(jié)
本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
分享一下8年C++面向?qū)ο笤O(shè)計(jì)的經(jīng)驗(yàn)體會(huì)
關(guān)于C++程序設(shè)計(jì)的書藉非常多,本章不講C++的語法,只講一些小小的編程道理。如果我能早幾年明白這些小道理,就可以大大改善數(shù)十萬行程序的質(zhì)量了2017-07-07
C++程序的執(zhí)行順序結(jié)構(gòu)以及關(guān)系和邏輯運(yùn)算符講解
這篇文章主要介紹了C++程序的執(zhí)行順序結(jié)構(gòu)以及關(guān)系和邏輯運(yùn)算符講解,是C++入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-09-09
淺談內(nèi)聯(lián)函數(shù)與宏定義的區(qū)別詳解
本篇文章是對(duì)內(nèi)聯(lián)函數(shù)與宏定義的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
C++實(shí)現(xiàn)線性表順序存儲(chǔ)的示例代碼
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)線性表順序存儲(chǔ)的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的可以了解一下2023-03-03
C語言 volatile與const同時(shí)使用應(yīng)注意的問題
“volatile”的含義是“請(qǐng)不要做沒譜的優(yōu)化,這個(gè)值可能變掉的”,而并非“你可以修改這個(gè)值”。因此,它們本來就不是矛盾的2013-09-09

