Tag: c

  • Python C Extension package version 設定

    不論是 setuptools 或是 distutils 都無法直接設定 C Extension package 的 version,必須採用紆迴的方式進行。 總而言之,Python 3.6 的年代,我們直接使用 setuptools。 0. 預期結果 >>> import jchash >>> jchash.__version__ ‘1.0’ 1.原始狀況 原始 Init function: PyMODINIT_FUNC PyInit_jchash(void) { return PyModule_Create(&module); } 原始 setup.py PACKAGE_VERSION = ‘1.0’ jchash = Extension(PACKAGE_NAME, define_macros=[ (‘PACKAGE_VERSION’, PACKAGE_VERSION)], sources=[‘src/jchash.c’]) 只有這樣是不夠的,Extension 的 define_macros 是在編譯時會加上 -DPACKAGE_VERSION=1.0 這樣的 flag,可是不會幫你轉換成為 package 的 version。 2.改用 PyModule_AddStringConstant 參考資料:PyModule_AddStringConstant…

  • 使用 C 來編寫 Python 模組 – 以 jump consistent hash 為例

    使用 C 來編寫 Python 模組 – 以 jump consistent hash 為例

    Extending Python with C – Jump Consistent Hash 本文的目標是以 C 完成 Jump Consistent Hash 的主體,接著透過 Python-C-API 轉為 Python 可以使用的套件。也就是說,模組的本體將會以 C 語言寫成,接著透過 setuptools 編譯為 so 檔,如此編成的模組將可以讓 Python 無縫接軌使用。 參考文章與程式原始碼: A Fast, Minimal Memory, Consistent Hash Algorithm: https://arxiv.org/pdf/1406.2294v1.pdf Python c-api: https://docs.python.org/3/c-api/intro.html Extending Python with C or C++: https://docs.python.org/3/extending/extending.html jchash – Jump Consistent Hash for Python: https://github.com/grapherd/jchash   1.我們的目標 閱讀完 <A Fast, Minimal Memory, Consistent…

  • gdb 顯示 FLAGS register

    假設有這樣的程式碼 > cat eflags.c #include <stdint.h> int main(void) { int32_t n = 2147483647; n = n + 1; printf(“%dn”, n); return 0; } 在 int32_t 的情況下,2147483647 是最大值,加上 1 之後預期 variable n 會 overflow。 我們都知道 CPU 裏面有 FLAGS register 可以表示處理器現在的狀況,那要怎麼在 gdb 裏面顯示呢? 只要在 gdb 裏面打這個指令就會顯示出 FLAGS register 目前的數值。 (gdb) info reg eflags eflags 0xa96 [ PF…

  • 4.x Linux kernel procfs guide (continue)

    今天正在釐清在 4.x 上可行的 procfs 應用方式,使用的範例是來自 crashcourse.ca 的 Introduction linux kernel programming,裏面系統的介紹了 procfs 與 seq_file 的使用方式,一共有三節可以看。 做完上面的練習之後,目前正在更新舊的 Linux kernel procfs guide,proting 成新版的 4.x Linux kernel procfs guide,整理之後,希望可以幫助到其他人學習這個地方。