文件描述符編程
一般是一個小的非負整數,也就是說0,1等函數
標準輸入,標準輸出和標準錯誤spa
standard input,standard output,standard error,在不作特殊處理的狀況下,3個描述符都連接到終端,也就是說,咱們用終端輸入,輸出和輸出錯誤,使用 < >符號來重定向輸入源和輸出目的。
code
不帶緩衝的I/O接口
函數open,read,write,lseek以及close提供了不帶緩衝的I/O,這些函數都使用文件描述符。get
#include "apue.h" #define BUFFSIZE 4096 int main(void){ int n; char buf[BUFFSIZE]; while((n=read(STDIN_FILENO,buf,BUFFSIZE))>0) if(write(STDOUT_FILENO,buf,n)!=n) err_sys("write error"); if(n<0) err_sys("read error"); exit(0); }
以上是一個複製文件的程序實例。input
重點代碼(4.1僅筆者本身理解,不做爲讀者參考):
原型
4.1 it
n=read(STDIN_FILENO,buf,BUFFSIZE)
STDIN_FILENO:是一個常量,POSIX標準的一部分,在unistd.h中定義,實際值爲0,表示從輸入源中讀取最大爲BUFFSIZE長度的內容到buf中,n表示讀入數據的長度,若是n大於0,則寫入到標準輸出:io
write(STDOUT_FILENO,buf,n)
STDOUT_FILENO跟STDIN_FILENO同樣都是一個常量,實際值爲1,如無重定向,則從buf中寫入n個字符到標準輸出,返回值若是不等於n則輸出錯誤。
輸入ctrl+d結束輸入。
4.2 重定向輸入源和輸出目的。
./a.out <infile>outfile
將infile中的內容讀入,並寫入到outfile,實現文件複製。
4.3 使用標準I/O
標準I/O函數爲那些不帶緩衝的I/O函數提供了一個帶緩衝的接口,標準io頭文件 stdio.h(忍不住吐槽下,雖然是高級編程,可是開篇例程並未引入標準io,後面再逐漸說起並且說的比較明白,比譚浩強的書更易懂一些。)
fgets:讀取一行
getc:讀取一個字符,getc(stdin);
putc:輸出一個字符到標準輸出,putc(c,stdout):輸出c到標準輸出
#include "apue.h" int main(void){ int c; while((c=getc(stdin))!=EOF) if(putc(c,stdout)==EOF) err_sys("output error"); if(ferror(stdin)) err_sys("input error"); exit(0); }
使用標準io的代碼跟不帶緩衝的io比起來,參數比較少,寫明的stdin和stdout也更容易閱讀。
一點我的思考,c代碼中常常見到在while,if等條件中執行語句的書寫方式,一般表示默認執行,若是知足/不知足條件再執行後面的語句,與c入門時的思惟方式或者其餘語言例程差異比較大,需得適應這種代碼書寫方式,要用好這種書寫方式應該要多熟悉標準庫函數原型,可以更好的利用函數的返回值做爲判斷條件,減小變量的定義,使代碼更加整潔。