TL;DR: 不要用 search.h 裡的 function.
最近需要改寫別人的程式,裡面有用到 search.h 裡的 function: hsearch
,hsearch 其實就是 hash table,搭配其他的一些 function 就可以不用自己實作。但是,這個 hsearch 的缺點卻非常多:
這邊是 wiki 上的範例: http://rosettacode ...
找了一些 JSON-C 的使用範例:
不過最上面兩個都有一個同樣的問題,就是多做了幾次不必要的 free,最後的 json_object_put
其實只要對最上頭的 root 做一次就好,這個 function 會將其中有參照的 object 都做 free ...
CGI 的 C 範例,大部分都是很簡單的,找不太到比較完整的資料,只找到 C++ 的,不過還是可以參考看看:http://www.tutorialspoint.com/cplusplus/cpp_web_programming.htm,裡頭有介紹到如何拿 GET, POST 的資料,還有一些常見的 header 欄位。
另外找了一下,怎麼切 cookie 裡的字串比較好,不過也是沒找到比較正統的做法,只看到這種做法:http://www.gnu-darwin.orgwww.gnu-darwin.org/www001/src/ports/security/zxid/work/zxid-0.22/zxidcdc.c,直接用 strstr
找到想要的欄位這樣。
通常 ppoll
和 pselect
會搭配 sigprocmask
使用,先透過 sigprocmask
block signal,然後在 ppoll
和 pselect
這邊再 unblock signal 做處理,例如常見的 daemon reload 可以這樣做:
// C
volatile sig_atomic_t reload_flag = 0, terminate_flag = 0;
static void sig_handler(int sig)
{
if (sig == SIGHUP) {
reload_flag = 1;
}
else if (sig == SIGTERM) {
terminate_flag = 1;
}
}
// A
sigset_t mask, orig_mask ...
可以參考這個連結的 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。
參考這篇,然後做了點修改。
#undef CM_DBG
#ifdef LTE_CM_DEBUG
# define CM_DBG(fmt, args...) do{
printf(" (%d/%s): "fmt, __LINE__, __FILE__, ## args);
}while(0)
#else
# define CM_DBG(fmt, args...)
#endif
#undef CM_DBGG
#define CM_DBGG(fmt, args...) do{
printf(" (%d/%s): "fmt, __LINE__, __FILE__, ## args);
}while(0)
大致除了命名外還做了點修改:
printk
的部分拿掉,因為我不需要。CM_DBGG
改成跟原本功能一樣 ...