TL;DR: 不要用 search.h 裡的 function.
最近需要改寫別人的程式,裡面有用到 search.h 裡的 function: hsearch
,hsearch 其實就是 hash table,搭配其他的一些 function 就可以不用自己實作。但是,這個 hsearch 的缺點卻非常多:
這邊是 wiki 上的範例: http://rosettacode ...
要實作 single instance 有幾種方式:
sem_open
參照一些 daemon 的作法,感覺 file lock 較常見。inet socket bind 的作法有點麻煩,因爲還要找個 port 來 bind,所以不考慮,unix socket 大略等同於 file lock 的作法,不過步驟太煩雜,所以也不考慮,semaphore(sem_open
)的作法看似比較好,因為 lock 是在 kernel 裡做管理,不用另外建 file,不過還是有一些問題在: How do I recover a ...
可以參考這個連結的 code: Unix Domain Socket,我後來發現我們 project 裡的 code 也是參考這邊的= =|||,不過的確是還缺少一些東西,像是可以再加上 select
或是 pselect
來另外處理 signal,我自己是用 pselect
就是,有想過用 ppoll
來做,不過實際會聽的連線很少,感覺沒必要就直接用 pselect
了。
修正一下,之後還是改用 ppoll
好了XD,查了一下資料,就算是一個 socket,poll
還是比 select
快~~,參照 Comparative measurements and analysis of I/O event notification mechanisms。epoll ...
sqlite3_exec(db, "BEGIN TRANSACTION;", NULL, NULL, NULL);
// if error
sqlite3_exec(db, "ROLLBACK;", NULL, NULL, NULL);
//else
sqlite3_exec(db, "END TRANSACTION;", NULL, NULL, NULL);
如果中間發生錯誤,就單做 ROLLBACK
就好, 不需要再做 END TRANSACTION
,下面 ref 第二篇裡面的邏輯有點問題,做了 ROLLBACK
然後 break
出去之後又做 COMMIT
,怪怪的。
Ref:
查了一些在 Linux 上怎麼用 C 寫一支 daemon 的做法:
另外就是有建議說: 不要直接 call unistd ...
查資料的時候看到的,不過資料裡的方式,宣告 0 陣列還是會過,所以我乾脆多減一:
#define TYPE_SIZE ((sizeof(int) == 4) - 1)
char arr[TYPE_SIZE];
完全不確定的話,也可以用 >
or <
抓範圍 lol。