Summary: | Ошибка сегментирования при использовании ctypes, системных вызовов и inspect | ||
---|---|---|---|
Product: | Sisyphus | Reporter: | Anton Zhukharev <ancieg> |
Component: | python3 | Assignee: | Grigory Ustinov <grenka> |
Status: | CLOSED NOTABUG | QA Contact: | qa-sisyphus |
Severity: | normal | ||
Priority: | P5 | CC: | amakeenk, george, glebfm, grenka, imz, vitty |
Version: | unstable | ||
Hardware: | x86_64 | ||
OS: | Linux | ||
URL: | https://www.destroyallsoftware.com/talks/wat |
Description
Anton Zhukharev
2023-08-04 15:41:19 MSK
Воспроизводится в сизифе по шагам из описания. Так это и не могло работать. Во-первых, должно быть _fields_, а не _fields, во вторых: $ python3 -c 'import ctypes; help(ctypes.ARRAY)' | cat Help on function ARRAY in module ctypes: ARRAY(typ, len) # XXX Deprecated $ cat test.py import ctypes c_char_array = ctypes.c_char * 65 class utsname(ctypes.Structure): _fields_ = [ ('sysname', c_char_array), ('nodename', c_char_array), ('release', c_char_array), ('version', c_char_array), ('machine', c_char_array), ('domainname', c_char_array), ] o = utsname() syscall = ctypes.CDLL(None).syscall syscall(63, ctypes.byref(o)) print(o.machine) Вот так даже будет работать, но если вы собираетесь этим на самом деле пользоваться -- WAT! :) (In reply to Gleb F-Malinovskiy from comment #2) > Так это и не могло работать. Во-первых, должно быть _fields_, а не _fields, Да, уже увидел, спасибо :) > во вторых: > > $ python3 -c 'import ctypes; help(ctypes.ARRAY)' | cat > Help on function ARRAY in module ctypes: > > ARRAY(typ, len) > # XXX Deprecated > $ cat test.py > import ctypes > > c_char_array = ctypes.c_char * 65 > > class utsname(ctypes.Structure): > _fields_ = [ > ('sysname', c_char_array), > ('nodename', c_char_array), > ('release', c_char_array), > ('version', c_char_array), > ('machine', c_char_array), > ('domainname', c_char_array), > ] > > o = utsname() > syscall = ctypes.CDLL(None).syscall > syscall(63, ctypes.byref(o)) > print(o.machine) > > Вот так даже будет работать, но если вы собираетесь этим на самом деле > пользоваться -- WAT! :) На самом деле я просто пытался разобраться с использованием ctypes в Python (честно говоря, мне не понравилось - проще уж на Си писать). И мне другой системный вызов нужен был :) Крест на конкретно этой затее поставила константа 65 (длина полей в utsname), которую в Python в общем случае в рантайме не определить (судя по исходникам, значения размеров тех или иных полей могут быть разными). :( (In reply to Anton Zhukharev from comment #3) > проще уж на Си писать). +1 > Крест на конкретно этой затее поставила константа 65 (длина полей в > utsname), которую в Python в общем случае в рантайме не определить Да ведь константа 63 тоже ничем не лучше. |