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. JSON-C Resources

    找了一些 JSON-C 的使用範例:

    不過最上面兩個都有一個同樣的問題,就是多做了幾次不必要的 free,最後的 json_object_put 其實只要對最上頭的 root 做一次就好,這個 function 會將其中有參照的 object 都做 free ...


  3. C CGI Resources

    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 找到想要的欄位這樣。


  4. C ppoll and pselect

    通常 ppollpselect 會搭配 sigprocmask 使用,先透過 sigprocmask block signal,然後在 ppollpselect 這邊再 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 ...

  5. 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 ...


  6. 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:



  7. 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


  8. C define debug function

    參考這篇,然後做了點修改。

    #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)
    

    大致除了命名外還做了點修改:

    1. printk 的部分拿掉,因為我不需要。
    2. CM_DBGG 改成跟原本功能一樣 ...

Page 1 / 2