gpt4 book ai didi

python ctypes 和 sysctl

转载 作者:太空狗 更新时间:2023-10-29 11:35:02 25 4
gpt4 key购买 nike

我有以下代码

import sys
from ctypes import *
from ctypes.util import find_library

libc = cdll.LoadLibrary(find_library("c"))
CTL_KERN = 1
KERN_SHMMAX = 34
sysctl_names = {
'memory_shared_buffers' : (CTL_KERN, KERN_SHMMAX),
}

def posix_sysctl_long(name):
_mem = c_uint64(0)
_arr = c_int * 2
_name = _arr()
_name[0] = c_int(sysctl_names[name][0])
_name[1] = c_int(sysctl_names[name][1])
result = libc.sysctl(_name, byref(_mem), c_size_t(sizeof(_mem)), None, c_size_t(0))
if result != 0:
raise Exception('sysctl returned with error %s' % result)
return _mem.value

print posix_sysctl_long('memory_shared_buffers')

产生以下结果:

Traceback (most recent call last):
File "test.py", line 23, in <module>
print posix_sysctl_long('memory_shared_buffers')
File "test.py", line 20, in posix_sysctl_long
raise Exception('sysctl returned with error %s' % result)
Exception: sysctl returned with error -1

我想我做错了什么。正确的调用约定是什么?我如何找出到底出了什么问题?

最佳答案

您没有为 sysctl 函数提供正确的值。可以找到有关 sysctl() 参数的详细信息 here .

这是你的错误:

  • 你忘记了nlen参数(第二个参数)
  • oldlenp 参数是一个指向大小的指针,而不是直接指向大小

这是正确的函数(略有改进):

def posix_sysctl_long(name):
_mem = c_uint64(0)
_def = sysctl_names[name]
_arr = c_int * len(_def)
_name = _arr()
for i, v in enumerate(_def):
_name[i] = c_int(v)
_sz = c_size_t(sizeof(_mem))
result = libc.sysctl(_name, len(_def), byref(_mem), byref(_sz), None, c_size_t(0))
if result != 0:
raise Exception('sysctl returned with error %s' % result)
return _mem.value

关于python ctypes 和 sysctl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/759892/

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