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的所有組合,你都要去測試一變,才能知道有無問題。

2008年4月21日 星期一

Linux的Messge queue簡介

Message queue應該是蠻常用的一種IPC,主要的特點是它能夠暫存不同型態的message,並且每一種型態都以Queue的存取方式來操作。比起share memory;Message Queue更能夠處理非同步的訊息。如果使用share memory的話,將會帶來非常多的同步問題,因為share memory只是一塊記憶體,沒有彈性去處理更多的資訊。而Message Queue卻可以讓訊息好好的排隊等著被處理來達成Producer & Consumer的處理模型 。

在Linux上面,可以用ipcs的shell指令來觀察目前所有的IPC資源使用情況:
#ipcs -s
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status

------ Semaphore Arrays --------
key semid owner perms nsems

------ Message Queues --------
key msqid owner perms used-bytes messages
0x000004d2 42631168 root 666 8 1
0x0000270f 42663937 root 666 2080 4
0x0000270e 42401794 root 666 0 0

一些使用法在Google上都可以找到,下面列出一些使用Message queue的重點:

1. 在Message Queue使用上來說,主要是靠一個號碼去跟Kernel要一個新的Message Queue。如果其他的行程也都用這個號碼開啟Message Queue的話,那每個行程都可以看到這個MessageQueue裡的東西。但是Message Queue可以存放著不同的型態的Message,因此各行程可以某個特定的形態去取得特定的Message。所以可以架構成多對多的通訊方式。

2. 如果任一行程將這個號碼的Message Queue做移除的動作,那正在操作Message Queue的行程都會讓msgrecv return -1。此時需要再去做message開啟的動作。

3. 如果msgrecv的返回值為-1而且errno=EINTR,這並不是因為message queue出錯,而是在等待message queue的同時,發生了signal中斷,因此kernel就會讓msgrecv返回-1,並且設定errno=EINTR。所以一定要去判斷errno,到底是為什麼傳回了-1。

2008年3月15日 星期六


今天到天瓏晃晃,想找看看有沒有新的書可以讓我充實一下。無意間看到這一本書就拿起來翻一翻,隨便一翻都會看到在職場上會碰到的問題,然後我就索性在天瓏給他買下來了。就如同書裡說的一樣,這本書已經是很多文章與經驗的菁華,也有非常多的引用,並不是唬爛的。它點出了一個軟體系統在實際寫程式前,需要做的功課有多重要。

蓋房子之所以能這麼快、這麼精準的在蓋完後就可以賣,全拜建築業早已有許多的流程與制度來輔佐設計師、工程師與工人。但軟體有沒有一些流程呢?可能有,但採用的公司非常的少。因為很多公司會認為軟體工程是不必要的,但奇怪的是這些公司在徵人的時候卻要找軟體工程師而不是程式設計師。這本書不是在講軟體工程的理論,而是告訴你如何做工程,才能以最短時間生出一個成功的軟體。

2008年3月5日 星期三

自己做的轉速表



這個轉速表是大學的時候做的。因為koso的轉速表要1000多,對學生來說真是一筆龐大的負擔。說難,程式其實也不是說很難寫。說簡單,要把這些電路手工塞到一個霧燈裡面是也不簡單了....尤其還要自己設計與裁剪電路板。我想只有對改車有一股熱誠才會做下去吧~~。如果也有車友想自己做,做個朋友,我可以指導你喔~~。
最近看到大千有出一個機車上的字幕機,感覺真的超炫的,不過居然要價3000上下。雖然是可以買來就直接裝上去,方便又很酷,但是在相關產業工作的人來說,這簡直是利潤蠻高的產品(但量很少)。所以我還蠻想要自己做一套的~~如果有車友有意思要開發可以跟我討論討論。

2008年3月1日 星期六

介紹Time-Triggered Cooperative Scheduler的書


前幾篇我分享的東西就是這一本書的內容。它是講Time-Triggered Cooperative Scheduler如何使用在8051上面來達到各種好處,我在這本書上面獲益良多。我認為大學內的8051課程要用這本當教科書才對,不然大多數的人都會認為寫8051就只是一些IO控制而已。
當然不只有單晶片能夠使用它,之前的分享文章也有提到在有OS的系統上面使用它會有什麼好處,那就請大家細細品嚐這本書囉~~~希望有機會能夠跟大家一起討論喔~~