1. 關於Standard I/O
stdout 是有緩存的,stderr 沒有,咱們能夠用fflush(stdout)來說緩衝區中的輸出輸出到console。
以下代碼會有奇怪行爲,由於stdout作了緩存。
while(1)
{
printf(".");
sleep(1);
}緩存
2. exit(1)和abort()
abort()函數是在發生了沒有預料到的事情的狀況下調用的,好比一個switch-case語句中,用default來捕捉那些沒能預料到的值。
exit(1)調用,發生了你遇到的的事情,可是這個事情不對,整個程序此時應該結束。好比打開一個file,結果失敗了,就exit(1)。函數
3. 臨時文件
若是程序使用到臨時文件(一般建立於/tmp目錄下),那麼要注意如下幾點
=》 文件名要惟一 (用mkstemp或者mkostemp確保,create+open)
=》 及時清除 (mkstemp後立馬unlink)
若是是要使用文件流的話,用tmpfile(void),這個函數返回臨時文件的文件流,而且能保證自動清除臨時文件。大數據
可是,對於在/tmp目錄下建立的named pipe(FIFO),咱們就不能用mkstemp和tmpfile,由於,通訊雙方有多是兩個不相關的進程,而他們必須知線程
道他們要打開的臨時文件名(即管道名),因此用prename_pid_fifo這種形式比較合理,好比,cli_19882_fifo。server
另外,temporary file提供了client-pipe-server之間傳輸大數據的一種方法。爲了保證寫操做的原子性,對named pipe(如下簡稱FIFO)的寫操進程
做的字節數,必需要小於PIPE_BUF這個宏定義的數量;因此,若是client要給server傳輸大數據的話,就不可避免的出現了數據拆分的狀況,而ip
server中處理包的線程有多個,因而就有可能出現不肯定的行爲,除非給各個線程間加上通訊和同步,這樣就把問題複雜化了。若是咱們利用temp 同步
file的話,那麼client就只須要告訴server說「我給你傳的此次數據比較大,在/tmp/xxxx」中,因而server就能夠利用這個temp file來獲取大段it
信息;注意此時server要在讀完temp file後unlink這個temp file。一般這個temp file的內容應該是「實際內容的長度(size_t的大小)+實際內pip
容」。