python ctypes和sysctl

我有以下代码

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()的参数的详细信息可以在这里找到。

这是你的错误:

  • 你已经忘记了无意义的论点(第二个论点)
  • 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