昨晚專門抽時間練習了一下檔案I/O編程,由於嵌入式Linux是經Llinux裁剪而來的,它的系統調用及使用者編程介面API與Linux基本一致,因此,學習Linux中相關內容的基本編程,對以後嵌入式Linux的實際開發是十分有協助的。
本文介紹幾個最最最基本的檔案I/O操作函數,如open、close、read、write、lseek等。
1.open
原型:int open(const char *pathname, int flags, int perms)
pathname表示要開啟的檔案名稱,flags表示檔案要開啟的方式,perms表示存取許可權。若成功,返迴文件描述符(一般用fd表示),失敗返回-1。具體的參數請各位自行查閱相關文檔。
2.close
原型:int close(int fd)
fd即在上述open函數獲得的檔案描述符,若成功返回0,出錯返回-1。
用法舉例:
int fd;<br />if((fd = open("/tmp/jarvis_hello.c", O_CREAT | O_TRUNC | O_WRONLY, 0600)) < 0);<br />{<br /> perror("open");<br /> exit(1);<br />}</p><p>if(close(fd) < 0)<br />{<br /> perror("close");<br /> exit(1);<br />}
3.read
原型:ssize_t read(int fd, void *buf, size_t count)
buf是指定儲存空間讀出資料的緩衝區,count指定讀出的位元組數。成功返回0,否則返回-1。
4.write
原型:ssize_t write(int fd, void *buf, size_t count)
buf是指定儲存空間寫入的資料緩衝區,count是寫入的位元組數,成功返回已寫入的字數,失敗返回-1
5.lseek
原型:off_t lseek(int fd, off_t offset, int whence)
offset是位移量,可正可負(前移、後移),whence有三個參數可供選擇:SEEK_SET檔案開頭,SEEK_CUR檔案當前位置,SEEK_END檔案結尾。whence配合offset就能確定當前需要操作檔案的具體位置了。執行成功,返迴文件當前的位移,失敗返回-1。
用法舉例:
int i, fd, size, len;<br />char *buf = "Hello, i`m Jarivs!";<br />char buf_r[10];<br />len = strlen(buf);</p><p>fd = open("tmp/jarvis_hello.c", O_CREAT | O_TRUNC | O_RDWR, 0666); //省略容錯檢測</p><p>if ((size = write(fd, buf, len)) < 0)<br />{<br /> ...<br /> //出錯處理<br />} //否則把"Hello, i`m Jarivs!"寫入檔案成功</p><p>lseek(fd, 0, SEEK_SET); //由於剛才寫入時改變了檔案指標位置,現將它複原到起始位</p><p>if ((size = read(fd, buf_r, 10)) < 0)<br />{<br /> ...<br /> //出錯處理<br />} //否則從檔案開始處讀出10個位元組成功</p><p>close(fd);<br />....... //省略</p><p>
對於有心學習Linux編程的你來說,僅僅看是不夠的,起碼要在自己的平台環境上,把程式敲敲,看究竟是否實現了自己預想的效果。以上僅對最基本的檔案I/O操作函數進行介紹,更多內容我將在之後的學習記錄中與大家分享,若有錯漏之處懇請各位看官指出。