apue是學習linux程式設計最權威的一本書,但權威也不是絕對的。上週讀到執行緒一章,在第304頁發現乙個bug:
函式foo_alloc(void)中:
fp->f_next = h[idx];
fh[idx] = fp->f_next; 改為 ==> fh[idx] = fp;
^^^^^^^^^^^^^
今天除錯第344頁的daemonize函式時又發現乙個bug,在damonize的最後加入 sigsuspend呼叫,再新增main函式讓程序跑起來,編譯後發現程序執行後立即退出,達不到damon程序的要求。 分析**,發現是setsid()的位置不對。
本書219頁闡述了 setsid的三個作用:
1> 該程序變成新會話首程序。
2> 該程序成為乙個新程序組的組長程序。
3> 該程序沒有控制終端。
**中呼叫setsid建立了乙個只有乙個程序的程序組,按書的**,setsid之前,父程序已退出,那麼setsid之後,子程序所在的程序組變成孤兒程序組,posix.1要求向新的孤兒程序組中處於停止狀態的每乙個程序傳送結束通話訊號(sighup),而系統對結束通話訊號的系統預設動作是終止該程序,所以在呼叫sigsuspend之後,程序接收sighup訊號便退出。
我改寫了書中的**(程式清單13-1):
#include "apue.h"
#include
#include
#include
#include
void daemonize(const
char *cmd)
/*我新增了以下三行*/
sigemptyset(&waitmask);
if (sigsuspend(&waitmask) != -1)
err_sys("sigsuspend error");
}/*還要新增乙個main函式讓**跑起來。*/
int main()
書評 《敏捷軟體開發》中文版第二版
當我看到第一章第一行正文時,我不禁深深嘆服於譯者的能力了。在思考軟體開發時,有一種富有成效的方式,那就是把它當作乙個創造和溝通的合作博弈。唔,這樣急促的呼吸,是剛剛輾轉於床第之間才能有的吧?我甚至都可以想象得見譯者於大汗淋漓之際,披衣下床,運指如飛,方才能有這樣的句式。在這個正常人居多的世上,強者終...
Effective Java 中文第二版
第2章 建立和銷毀物件 第1條 考慮用靜態工廠方法代替構造器 第2條 遇到多個構造器引數時要考慮用構建器 第3條 用私有構造器或者列舉型別強化singleton屬性 第4條 通過私有構造器強化不可例項化的能力 第5條 避免建立不必要的物件 第6條 消除過期的物件引用 第7條 避免使用終結方法 第3章...
Effective Java 中文第二版
第2章 建立和銷毀物件 第1條 考慮用靜態工廠方法代替構造器 第2條 遇到多個構造器引數時要考慮用構建器 第3條 用私有構造器或者列舉型別強化singleton屬性 第4條 通過私有構造器強化不可例項化的能力 第5條 避免建立不必要的物件 第6條 消除過期的物件引用 第7條 避免使用終結方法 第3章...