Доступ к магическим числам/флагам заголовка C с помощью Cython

Некоторые стандартные библиотеки C, к которым я хочу получить доступ с помощью Cython, имеют массу флагов. В документах Cython указано, что я должен реплицировать нужные мне части заголовка. Что хорошо, когда дело доходит до определения функций. Обычно они тиражируются везде, включая документы. Но как насчет всех этих магических чисел?

Если я хочу вызвать mmap, я всегда могу найти определение функции и вставить его в файл .pxd:

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

Но для его вызова требуется множество флагов, таких как PROT_READ, MAP_ANONYMOUS и так далее. У меня есть как минимум две проблемы с этим:

Во-первых, утомительно выискивать, где именно определены эти числа. На самом деле я бы предпочел написать файл .c и распечатать нужные мне значения. Есть ли лучший способ найти значение данного флага, такого как PROT_READ?

Во-вторых, насколько стабильны эти цифры? Извлекая все нужные мне значения и жестко запрограммировав их в мой исходный код Cython, каковы шансы, что компиляция на другой платформе поменялась местами, скажем, PROT_READ и PROT_EXEC?

Даже если ответ заключается в том, что нет хороших или правильных способов сделать это, я хотел бы его услышать. Я всегда могу принять, что что-то громоздко, если я знаю, что ничего не упускаю.


person porgarmingduod    schedule 05.02.2010    source источник


Ответы (3)


Чтобы использовать эти константы из 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, это должно работать нормально.

person user194910    schedule 06.02.2010

Есть несколько возможных альтернатив:

  1. Use the flags from the Python mmap module.
    • simple
    • работает только при наличии существующих привязок Python
  2. Use the Python mmap object in the first place, and hand it over to your Cython code
    • even simpler openening
    • могут быть некоторые накладные расходы Python
  3. Use the code generator of ctypeslib
    • some docs on how to extract constants
    • нужен gccxml
  4. Просто скопируйте цифры.

При этом цифры очень и очень стабильны. Если бы они изменились, каждую программу на C, использующую mmap, пришлось бы перекомпилировать, поскольку флаги из заголовков содержатся в двоичном файле.

EDIT: mmap является частью POSIX , но беглое чтение не показало, должны ли флаги иметь одинаковое значение на всех платформах.

person Torsten Marek    schedule 05.02.2010
comment
Ситуация с переносимостью плохая: некоторые значения определены POSIX, некоторые нет. POSIX в значительной степени исправлены, другие могут варьироваться от платформы к платформе. - person Andrew McGregor; 05.02.2010

Напишите файл foo.c с таким содержимым:

#include <sys/mman.h>

Затем запустите

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

который создаст файл python, определяющий все константы из mman.h

Очевидно, вы можете сделать это для нескольких включений, если хотите.

Полученный файл может нуждаться в небольшой очистке, но это поможет вам приблизиться.

person Andrew McGregor    schedule 05.02.2010