Система: ======== ALT Workstation K 10.2 (обновлена 04.08.2023). Пакеты: ======= python3-3.9.16-alt1.x86_64 Шаги воспроизведения: ===================== $ cat << \EOF >> script.py import ctypes class utsname(ctypes.Structure): _fields = [ ('sysname', ctypes.ARRAY(ctypes.c_char, 1024)), ('nodename', ctypes.ARRAY(ctypes.c_char, 1024)), ('release', ctypes.ARRAY(ctypes.c_char, 1024)), ('version', ctypes.ARRAY(ctypes.c_char, 1024)), ('machine', ctypes.ARRAY(ctypes.c_char, 1024)), ('domainname', ctypes.ARRAY(ctypes.c_char, 1024)) ] o = utsname() syscall = ctypes.CDLL(None).syscall syscall(63, ctypes.byref(o)) import inspect EOF $ python3 ./script.py Фактический результат: ====================== Ошибка сегментирования. Ожидаемый результат: ==================== Ошибки сегментирования нет. Частота воспроизведения: ======================== Всегда.
Воспроизводится в сизифе по шагам из описания.
Так это и не могло работать. Во-первых, должно быть _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 тоже ничем не лучше.