gpt4 book ai didi

python - 使用 Pythons ctypes 从 libc 调用 uname

转载 作者:太空狗 更新时间:2023-10-30 03:07:06 26 4
gpt4 key购买 nike

tl;博士

这适用于 GNU 版本的 libc(尚未在 uclibc 上尝试过)

from ctypes import *

libc = CDLL('libc.so.6')

class uts_struct(Structure):
_fields_ = [ ('sysname', c_char * 65),
('nodename', c_char * 65),
('release', c_char * 65),
('version', c_char * 65),
('machine', c_char * 65),
('domain', c_char * 65) ]

gnar = uts_struct()

libc.uname(byref(gnar))

print gnar.nodename

原帖

以下代码段错误;我不确定我做错了什么。

from ctypes import *

libc = CDLL('libc.so.6')

class uts_struct(Structure):
_fields_ = [ ('sysname', c_char_p),
('nodename', c_char_p),
('release', c_char_p),
('version', c_char_p),
('machine', c_char_p) ]

utsname = uts_struct()
libc.uname(byref(utsname))

print utsname.sysname

这做同样的事情:

from ctypes import *

libc = CDLL('libc.so.6')

class uts_struct(Structure):
_fields_ = [ ('sysname', c_char_p),
('nodename', c_char_p),
('release', c_char_p),
('version', c_char_p),
('machine', c_char_p) ]

utsname = uts_struct()
utsname_pointer = pointer(utsname)
libc.uname(utsname_pointer)

print utsname.sysname

我一定是搞砸了一些基本的东西......

(我知道 os.uname(),这只是一个理解练习,我没有做到)

我在这里引用了 uname 手册:http://www.cl.cam.ac.uk/cgi-bin/manpage?2+uname

我做错了什么?


编辑:

感谢Nemo我能够获取数据;

>>> from ctypes import *
>>> libc = CDLL('libc.so.6')
>>> gnar = create_string_buffer(512)
>>> libc.uname(byref(gnar))
0
>>> print gnar.value
Linux
>>>

但是,我假设我只获得“Linux”,因为这些项目是 NULL 分隔的,调节器字符串也是如此。有什么办法可以读过 NULL 吗?


编辑2:

根据 Nemos 的评论,我已经尝试过这个 - 这是行不通的,但我认为这可能是朝着正确方向迈出的一步......错误:

Traceback (most recent call last):
File "gnar.py", line 18, in <module>
utsname = uts_struct(gnar)
TypeError: incompatible types, c_char_Array_512 instance instead of c_char_p instance

这是不可行的吗?

from ctypes import *

libc = CDLL('libc.so.6')

class uts_struct(Structure):
_fields_ = [ ('sysname', c_char_p),
('nodename', c_char_p),
('release', c_char_p),
('version', c_char_p),
('machine', c_char_p) ]

gnar = create_string_buffer(512)
libc.uname(byref(gnar))
utsname = uts_struct(gnar)

Edit3:(我要写有史以来最长的帖子...=P)

from ctypes import *
libc = CDLL('libc.so.6')
class uts_struct(Structure):
_fields_ = [ ('sysname', c_char * 65),
('nodename', c_char * 65),
('release', c_char * 65),
('version', c_char * 65),
('machine', c_char * 65) ]
gnar = uts_struct()
libc.uname(byref(gnar))
print gnar.machine

这有效,但是,它在打印值后出现段错误...


最终编辑:

以下作品——我当然使用的是 GNU 版本的 libc。 (我在 Ubuntu 机器上)所以添加域的字段就是停止段错误所需​​要的。事后看来这是有道理的。 :)

from ctypes import *

libc = CDLL('libc.so.6')

class uts_struct(Structure):
_fields_ = [ ('sysname', c_char * 65),
('nodename', c_char * 65),
('release', c_char * 65),
('version', c_char * 65),
('machine', c_char * 65),
('domain', c_char * 65) ]

gnar = uts_struct()
libc.uname(byref(gnar))
print gnar.nodename

最佳答案

根据 this uname man page , 该结构包含实现定义大小的数组,而不是 char* (c_char_p)。你看过sys/utsname.h中的结构定义了吗?您必须匹配确切的结构定义。数据类型可能应该是 c_char * n,其中 nsys/utsname.h 中找到的该字段的数组大小。

或者,您应该能够使用 print gnar.raw 访问第一个 Edit 中的所有字符串,只要缓冲区足够大即可结构。

关于python - 使用 Pythons ctypes 从 libc 调用 uname,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6221001/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com