4

Cythonでアクセスしたいいくつかの標準Cライブラリには、たくさんのフラグがあります。Cythonのドキュメントには、必要なヘッダーの部分を複製する必要があると記載されています。関数の定義に関しては、これで問題ありません。それらは通常どこにでも複製され、ドキュメントが含まれます。しかし、これらすべてのマジックナンバーはどうですか?

を呼び出したい場合はmmap、いつでも関数定義を見つけて.pxdファイルに貼り付けることができます。

void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset)

PROT_READしかし、それを呼び出すには、などのような大量のフラグが必要MAP_ANONYMOUSです。これには少なくとも2つの問題があります。

まず、これらの数値が定義されている場所を正確に特定するのは面倒な作業です。実際、私はむしろ.cファイルを作成し、必要な値をprintfしたいと思います。次のような特定のフラグの値を見つけるためのより良い方法はありますPROT_READか?

第二に、これらの数値はどれくらい安定していますか?必要なすべての値を抽出し、それらをCythonソースにハードコーディングした後、別のプラットフォームでのコンパイルが切り替わった可能性はどのくらいPROT_READありPROT_EXECますか?

良い方法や適切な方法がないと答えても、聞きたいです。何かを見逃していないことがわかっている限り、何かが面倒であることをいつでも受け入れることができます。

4

3 に答える 3

6

Cythonのこれらの定数を使用するために、それらがどこから来たのか、またはCからの定数よりも何であるのかを正確に把握する必要はありません。たとえば、.pxdファイルは次のようになります。

cdef extern from "foo.h":
    void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset)
    cdef int PROT_READ
    cdef int MAP_ANONYMOUS
    ...

定義が(直接的または間接的に)foo.hから含まれている限り、これは正常に機能するはずです。

于 2010-02-06T06:29:59.100 に答える
2

いくつかの可能な選択肢があります:

  1. Pythonmmapモジュールのフラグを使用します。
    • 単純
    • 既存のPythonバインディングがある場合にのみ機能します
  2. そもそもPythonmmapオブジェクトを使用して、Cythonコードに渡します
    • さらに簡単な開放
    • Pythonのオーバーヘッドがあるかもしれません
  3. のコードジェネレータを使用するctypeslib
  4. 番号をコピーするだけです。

そうは言っても、数字は非常に安定しています。それらが変更された場合、ヘッダーからのフラグがバイナリに含まれているため、mmapを使用するすべてのCプログラムを再コンパイルする必要があります。

EDITmmapPOSIXの一部ですが、大まかに読んでも、フラグがすべてのプラットフォームで同じ値である必要があるかどうかはわかりません。

于 2010-02-05T10:57:02.597 に答える
1

これを内容としてファイルfoo.cを記述します。

#include <sys/mman.h>

次に実行します

cpp -dM foo.c | grep -v __ | awk '{if ($3) print $2, "=", $3}' > mman.py

これにより、mman.hのすべての定数を定義するPythonファイルが作成されます。

もちろん、必要に応じて、複数のインクルードに対してこれを行うことができます。

結果のファイルは少しクリーンアップする必要があるかもしれませんが、それはあなたを近づけるでしょう。

于 2010-02-05T11:04:45.197 に答える