Linux下C程式設計入門筆記 檔案IO操作

2021-05-25 17:45:49 字數 2622 閱讀 3620

(一)

linux檔案的io程式設計應該算是每個入門者最先涉及的,我也不例外。希望通過blog的形式,記錄下自己每天學習的點點滴滴,我相信滴水穿石,儘管記錄的文字都比較簡單,對於高手而言抑或沒有什麼技術含量,但我堅信堅持到最後,就是大牛。

好了,廢話說了不少了,開始我的筆記吧。

linux下對檔案的操作同其它平台系統一樣,無外乎建立檔案,開啟檔案,關閉檔案,讀檔案,寫檔案,拷貝檔案,對檔案進行許可權的控制和管理(這涉及到鎖,以後再討論),另外在這裡有一點一定要牢記,那就是在linux作業系統裡,硬體裝置也當作檔案來對待,我認為這樣最大的好處是可以實現檔案和裝置的統一管理,比如我在上面提到的操作(開啟檔案,關閉檔案,讀檔案,寫檔案.....),也通用於硬體裝置的操作(開啟裝置,關閉裝置,讀裝置件,寫裝置......).明白了這一點,就可以很發揮想象怎麼去搞定串列埠,並口,usb裝置........等一系列外圍裝置了.(是不是很吃驚).

檔案io操作是linux環境程式設計基礎中的基礎.語法和api上看似簡單,但真正的應用起來,有時恐怕並不如我最開始想象的那麼輕鬆,所以既然是菜鳥入門,還是要把基礎打好.為了讓自己找到樂趣和自信,我決定從最簡單的函式開始.creat建立檔案.

create函式的原型如下:(大家可以查詢manpages.chm)

int creat(const char *pathname, mode_t mode);

引數代表的意思,manpages裡講得確實已經非常清楚了.下面我寫了乙個簡單的例子.(這個例子確實是太簡單啦,但是養成動手的好習慣會讓每一位程式設計師受益)

#include

#include

#include

#include

#include

void  create_file(char *filename)else

int main(int argc,char *argv)

for(i=1;iexit(exit_success);

}這個例子沒有太多要說的了,但還是想囉嗦一下,建立檔案時,腦海裡為何飄出乙個0755,這是檔案的讀寫執行許可權,就是rwx和4 2 1碼的對應關係相加,manpages裡也有詳細說明

執行的結果如下:

[hacker@localhost project]$ ./create temp1 temp2

create file temp1 success!

create file temp2 success!

(二)int open(const char *pathname, int flags);

int open(const char *pathname, int flags, mode_t mode);

哦,對了,前一篇我忘了講了,其實open同樣有建立檔案的功能,利用其引數就能實現,creat僅僅是建立乙個檔案,而open不僅可以建立檔案,建立檔案後會把所建立的檔案直接開啟,方便後續操作.

這裡有幾點可以思考,當我們要建立乙個檔案時,然後對檔案進行相關讀寫操作時,我們是用creat還是open? 這不廢話嗎? 當然是用open一步到位啦,省得建立了檔案再來呼叫open.另外creat和open在執行完之後分別返回些什麼,讓我們知道執行的結果如何? 這裡我們要先了解另外乙個概念,檔案描述符,如果不清楚,先去翻翻教材,我在這種裡簡單地將檔案描述符理解為,linux系統中,對檔案的唯一標識,我們在程式設計時通常這麼定義這個變數int fd;fd一看就明白了吧,只要你英語不是白痴,file descriptor. 是int型別的,如果open和creat乙個檔案成功的話,就會返回此檔案的描述符是乙個大於0的整數.所以當我們呼叫open和creat之後我們可以根據其返回值是否大於0判斷執行是否ok,如是不ok,就錯誤處理或搞其它的操作也行,隨你便了.

剛才列出了open的兩個不同的函式原型,也說到了open有建立檔案的功能,這裡可以一起發出兩個疑問,為什麼open要有兩個函式實現?如何用open來建立檔案呢?

能產生這兩個疑問真是太好了.比較下那兩個open的原型,發現只是多了乙個mode_t型別的引數啊.前一篇其實用過mode_t這個引數了,我當時頭腦發熱給建立的檔案,設定mode_t的值為0755 ,就是rwx許可權.你可以繼續思考,為什麼開啟乙個檔案時,乙個需要許可權引數,乙個不需要呢,謎底終於被你揭開了.因為當我們用open建立乙個檔案時,我們希望建立檔案時就給檔案賦上相應的許可權,而如果僅僅是開啟乙個已存在的檔案或裝置,這個許可權就不需要了,其實這裡還是沒有說到重點.下面通過真實的例子來說說,是怎麼一回事

#include

#include

#include

#include

#include

int main(int argc ,char *argv)

//如果flag引數裡有o_creat表示,該檔案如果不存在,系統則會建立該檔案,該檔案的許可權由第三個引數決定,此處為0755

//如果flah引數裡沒有o_creat引數,則第三個引數不起作用.此時,如果要開啟的檔案不存在,則會報錯.

//所以fd=open(argv[1],o_rdwr|o_trunc),僅僅只是開啟指定檔案

if((fd=open(argv[1],o_creat|o_rdwr|o_trunc,0755))<0)else

close(fd);

exit(0);

}這段**並沒有把open和close的功能表現得很完全,但是基本上就是引數的不同,而產生不同的功能了,多查api.

Linux下C程式設計入門筆記 檔案IO操作(二)

int open const char pathname,int flags int open const char pathname,int flags,mode t mode 哦,對了,前一篇我忘了講了,其實open同樣有建立檔案的功能,利用其引數就能實現,creat僅僅是建立乙個檔案,而ope...

Linux下C程式設計入門

這裡向大家介紹一下在linux unix 的機器上,進行 c c 程式設計的一些入門級知識。所需具備的背景知識 開發所需的基本環境 獲得幫助的途徑 通過乙個例項了解基本步驟 prerequisite 先決條件 在linux上編寫 c 程式,至少要熟悉以下兩方面的基礎知識 1 c語言的程式設計基礎,至...

linux下C程式設計筆記

1 system 函式 相關函式 fork,execve,waipid,popen 表頭檔案 include 函式定義 int system const char string 返回值 如果fork 失敗 返回 1 出現錯誤 如果exec 失敗,表示不能執行shell,返回值相當於shell執行了e...