Tuesday, November 25, 2008

筆記

最近學習的筆記

filename是已經存在的10MB檔案,
sample 1)
fopen(filename, "wb");
sample 2)
fp=fopen(filename, "ab");
rewind(fp);
之間的差異
--------------------------------------------------------------
理論上從上層來看是沒啥差異, 但談到kernel如何配置
新的區塊, 就有不一樣的結果
sample 1, 會先縮減filename的大小, 再重新配置一塊區塊使用
並且將index指到檔案起始位置.
sample 2, 打開filename後, 會將index指到檔案尾,
rewind再重新將index指回檔案頭.
因此, sample2會比較有的效率, 少了重新配置區塊的動作,
以及, 減少fragment的機會.
=========================================================
fprintf(stdout, "hello world\n");
fprintf(stderr, "hello world\n");
Q:之間的差異?
-------------------------------------
stdout會先要列印的字串, 收集到預設的buffer,
待buffer滿時, 再一次輸出
stderr會直接輸出要列印的文字
=========================================================
Q:如何判斷檔案的大小
Sol1,
用 fstat(fd, &statbuf) 取得, statbuf.st_size即為檔案的大小
Sol2,
fseek(fp, 0, SEEK_END);
filesize=ftell(fp);
=========================================================
何時使用multi-process?何時使用multi-thread?
一般建議用multi-thread, 比較節省resource的使用, 但缺點在於當其中某個thread發生問題, 整個processs, 會隨之crash.
sol1, 找出造成問題的點
sol2, 趕時間的話, 保留multi-thread的架構, 但試著將會crash的函式以multi-process方法產生, 這樣會crash的, 只有那個process, 而不是主process.
=========================================================
Kernel不允許User space Application攔j載SIGKILL, 所以最後手段可以透過 kill -9 app, 結束程式.
但何時送SIGKILL, 也沒有辦法結束程式呢?
有可能該程式正卡在底層driver, 或是kernel space某處, 因此送出SIGKILL, 會沒有反應, 這種情況通常可以透過 ps, 看該程式的process status是否為 D ( Uninterruptible sleep (usually IO) )得知.
=========================================================
什麼時候用udp?什麼時候用tcp?
case1,
case2,
傳送資料量小時, 可以考慮用udp,相反的,資料量大的,考慮用tcp吧
=========================================================
同步與非同步的例子?
=========================================================
signal handler內是否要重新註冊signal handler
it depends.
舊時期的系統會將signal導給已註冊的handler後, 回到預設的handler
近期的linux, 則相反, 會一直保留已註冊的handler
為了相容性考量, 建議重新註冊signal handler
總之, 要跑過才能知道真正的行為表現
=========================================================
給測試部時, 要給release版或debug版呢?
如果測試部人手比較多的話, 可以建議2種版本都出
但如果人手不夠的話, 還是只能出release版的
=========================================================
export LD_LIBRARY_PATH=.:$(LD_LIBRARY_PATH)
=========================================================

No comments: