1. C search.h

    TL;DR: 不要用 search.h 裡的 function.

    最近需要改寫別人的程式,裡面有用到 search.h 裡的 function: hsearch,hsearch 其實就是 hash table,搭配其他的一些 function 就可以不用自己實作。但是,這個 hsearch 的缺點卻非常多:

    1. hash table 的 size 必須是固定的
    2. 沒有 method 可以 traverse 整個 table 的 entry
    3. 記憶體管理很麻煩,可能還必須自己再 maintain 一個 linked list 才行

    這邊是 wiki 上的範例: http://rosettacode ...


  2. Linux Single Instance Lock

    要實作 single instance 有幾種方式:

    • file lock
    • inet socket lock
    • 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 ...


  3. C UNIX Socket

    可以參考這個連結的 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 mechanismsepoll ...


  4. C SQLite Transaction

    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:



  5. Check Type Size at Compile Time in C

    查資料的時候看到的,不過資料裡的方式,宣告 0 陣列還是會過,所以我乾脆多減一:

    #define TYPE_SIZE ((sizeof(int) == 4) - 1)
    char arr[TYPE_SIZE];
    

    完全不確定的話,也可以用 > or < 抓範圍 lol。

    Ref:
    Compile Time Assertions in C


Page 1 / 1