2008年5月27日 星期二

Father process is killed by a signal after calling system()

大家都知道system()是在程式裡面執行shell命令的函式,它裡面會使用fork去創造一個shell行程,並且用shell行程去執行shell命令。但是man裡面並沒有提到他會發出一個signal 17,有些版本的Linux系統收到此signal後,會執行Term的動作,此網頁有詳細介紹:http://linux.about.com/od/commands/l/blcmdl7_signal.htm

為了避免system()會因為它裡面所開的子行程要結束,而送出signal 17,必須要在安裝一個signal的時候所使用的sigaction函式,加上SA_NOCLDSTOP的flag。才不會讓父行程收到signal 17,這樣才不會無緣無故的呼叫system後父行程因為system()而死掉。

這邊提醒一下,不是只有這個signal要擷取。而是所有的signal都需要擷取下來,然後做妥善的處理。

2008年5月10日 星期六

呼叫pthread_cancel發生segmentation fault

可能是因為pthread_cancel裡面是使用動態記憶體配置,如果拿同一個pthread_t傳入pthread_cancel兩次,那麼第二次呼叫的時候就會收到SIGSEGV信號。這個問題通常是沒做好資源保護,而造成的race condition。

這個pthread_cancel一呼叫後,預設動作並不會馬上就把該thread給停掉,而是在某些system call裡面來做停止的動作,因此這些system call也就是所謂的cancel point。所以使用這個function時候需要非常非常的小心,因此我的建議是在你的一生中,都不要用這個function....。或許太嚴重了,不過真的要非常小心才是。因為還有非常多方法可以避免掉呼叫這個function,來結束一個thread

所以一個thread,最好幫他設計一個Finite State Machine(FSM),藉由狀態的控制,來改變thread的行為。因為FSM的設計可以讓你限定這個Thread的狀態,狀態的切換之間可準確的控制資源的配置與釋放。如果使用一般無組織的flag來決定thread的運作,那這些flag的所有組合,你都要去測試一變,才能知道有無問題。