上次的筆記中寫到的 open, read, write, lseek 以及close ,都是不帶緩存的IO函數,這些函數都使用文件描述符進行工做。api
上一篇筆記用到的 read(STDIN_FILENO, buf, BUFFSIZE) 和 write(STDOUT_FILENO, buf, n) 函數中的2個參數 STDIN_FILENO 和 STDOUT_FILENO 是 __POSIX__標準的一部分,不少函數原型都在其中,這2個參數定義在 <unistd.h> 頭文件中,他們是標準輸入輸出的文件描述符,大部分狀況下他們都是0 和1,爲了保證可移植以及兼容性問題,不少api中都不使用c原生的數據類型,因此咱們使用了它的一個能夠替代的宏。緩存
read 函數返回讀取到的字節數,這個值用來看成__write__ 函數的第二個參數, 當到達文件的末尾時,read返回0, 這個時候程序正常終止運行,若是發生錯誤則返回 -1 。函數
標準IOunix
標準 IO 函數提供了對不支持緩存的原生 IO 函數帶 緩存的界面,使用標準IO函數不用擔憂BUFFSIZE大小的問題,由於它總能獲取準確併合適的長度, 進一段原文中的例子程序.指針
#include <stdio.h> int main(void) { int c; while((c = getc(stdin)) != EOF) { if(putc(c, stdout) == EOF) { printf("output error"); } } if(ferror(stdin)) { printf("input error"); } exit(0); }
該程序很是容易理解,getc() 不停的從標準輸入讀取數據,putc 則不停的把輸入的數據反饋到標準輸入, 這幾個api的原型都在 __stdio.h__頭文件中, 文章末尾會分析每次遇到的api。code
程序
程序並非進程,程序只有在運行的時候纔會存在於進程之中, 當磁盤上的某個可執行文件被內核載入內存而且執行以後纔會造成進程,內核使用6個exec函數中的一個來載入可執行程序。進程
進程和進程ID
程序執行的實例被稱爲進程(process),有的書中也叫作任務,用任務和進程來表示運行狀態中的可執行程序,都是能夠理解的。unix系統中的每個進程都經過一個進程標示符來區分,這個由數字組成的符號被稱作 進程ID, 是一個非負整數。內存
#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <unistd.h> int main(void) { pid_t pid = getpid(); printf("hello world from process ID :%d \n", pid); exit(0); }
===========================get
stdio.h int getc(FILE *stream) 該函數的功能是從文件流中讀取下一個字符,而且以無符號整數返回,也可能返回文件末尾標識和錯誤信息。 stdio.h int putc(int c, FILE *stream); 該函數用於向文件流寫入一個字符。 c : 要寫入的字符,整形, 寫入的時候會自動轉換爲無符號字符型 stream : 要寫入的文件指針。 返回值: 寫入的字符轉換成整形後的值,發生錯誤則返回EOF 該函數有多是用宏定義實現的。 sys/types.h unistd.h pid_t getpid() 該函數用來返回當前進程的ID。