我有以下代码
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()参数的详细信息。
这是您的错误:
这是正确的功能(稍有改进):
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