之前介紹過如何讓JAVA執行外部的指令。但若程式希望等待外部的指令執行完後,再繼續執行原來的程式,我們可以利用Process類別的waitFor()指令。waitFor()會讓目前的thread等待,直到Process物件終止才會繼續開始。
Runtime rt = Runtime.getRuntime();
try {
Process proc = rt.exec(new String[] {"..." } );
proc.waitFor(); //等待proc完成
}
catch(Exception ex) {
ex.printStackTrace();
}
2007年11月29日 星期四
waitFor
2007年11月26日 星期一
Linphone-2.0.0安裝失敗
由於實驗一直不是很順利,所以就逛逛Linphone的網頁,才發現近期已經更新到2.0.0版,改了蠻多的東西,而且也可以處理re-INVITE的訊息。於是心中閃過一個念頭就是「要不要將UA改用linphone」。
二話不說,馬上就下載原始碼自行編譯,原以為應該可以很順利的,沒想到困難重重,一堆軟體要裝也就算了,在make過程中又出現一些error。所以也請建霖裝在Fedora試試,沒想到竟然成功裝好了,讓我充滿期待。只不過,事情並沒那麼單純,視窗介面竟然弄不出來,只有文字模式,怎麼會這樣呢?
所以,還是乖乖的弄我的MjSIP吧!
Concurrent Server
Server可以分為兩種型態,iterative和concurrent。
iterative server一次服務一個使用者,所以若其中某個使用者的服務時間過久,會影響到整個效能。而concurrent server則是可以同時服務多個使用者,最簡單的方法可以利用fork來產生child process來達成此目的。下面則為簡單的範例。
pid_t pid;
int listenfd, connfd;
listenfd = socket( ... );
bind(listenfd, ... );
listen(listenfd, 5);
for (; ;) {
connfd = accept (listenfd, ... );
if((pid = fork()) == 0) {
close(listenfd);
handle the connection
close(connfd);
exit(0);
}
close(connfd); // 由於fork產生的child process會讓connfd的reference counter多1,要記得關掉
}
2007年11月25日 星期日
Ping的換手小測試
之前做SIP換手實驗的數據,結果與預期有甚大的落差,於是決定先把問題簡單化,再慢慢來擴大。於是就選擇用Ping程式先來測試一下換手的過程。
先寫簡單的shell script,把要進行的步驟寫起來,包括換AP以及設定新IP。同時間,也利用抓封包的軟體來檢驗實驗的結果。
一開始測試的結果,換手的時間還是很大。仔細看了一下抓下來的封包,發現Echo request的確是用新的IP當來源繼續送,但卻沒有Echo reply回來。直到出現NA、NS封包完成後,Echo reply就回來了。這對NA、NS是在要求對方的MAC位址,類似IPv4的ARP。
於是就猜測是Mobile Node到新網路不知道新的AP的MAC,而新AP也不知道MN的MAC。所以就修改了一下之前的shell script,再換手後,馬上在neighbor cache加上AP的MAC,同時間也在AP加上MN的MAC。
經過再次的實驗,換手時間降低了不少。
2007年11月24日 星期六
Debian編譯核心
用Debian的方式編譯核心,可以將編好的核心變成deb檔,方便管理
首先,下安裝編譯時需要的工具
# apt-get install fakeroot kernel-package libncurses5-dev bzip wget build-essential
下載所需的核心並解壓縮在/usr/src裡
# cd /usr/src
# wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.23.8.tar.bz2
# tar jxvf linux-2.6.23.8.tar.bz2
# cd /usr/src linux-2.6.23.8
開始編譯核心
# make menuconfig
# make-kpkg clean
# fakeroot make-kpkg --initrd --append-to-version=-custom kernel_image kernel_headers
若無任何錯誤訊息,代表已經成功編譯完成,在/usr/src會出現兩個deb檔
# dpkg -i linux-image-2.6.23.8-custom_2.6.23.8-custom-10.00.Custom_i386.deb
# dpkg -i linux-headers-2.6.23.8-custom_2.6.23.8-custom-10.00.Custom_i386.deb
重開機即可
fork
如何寫一個concurrent server?我們可以使用fork這個function來達成,定義於"unistd.h",用法如下:
pid_t fork(void);
呼叫fork()會產生一個child process,在呼叫fork()指令之前所有parent process開啟的descriptors會與child processs共享。至於如何分辨parent還是child,則依呼叫fork()後的回傳值決定,parent會收到child的Process ID,而child則會收到0。因為,兒子只有一個父親,只要呼叫getppid即可取得父親的PID,而父親可能會有很多的兒子,所以需要記錄每一個兒子的PID。
fork有兩種使用方法:
- Process複製自己一份,讓其中一個處理某一個運算,另一個則是做其它事。
- Process想執行其它程式,當呼叫fork時會複製一份child process,然後child process執行exec用新程式來取代目前的程式。
