首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python ctype和sysctl

python ctype和sysctl
EN

Stack Overflow用户
提问于 2009-04-17 10:24:39
回答 1查看 2.7K关注 0票数 3

我有以下代码

代码语言:javascript
复制
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')

这将产生以下结果:

代码语言:javascript
复制
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

我猜我做错了什么。正确的调用约定是什么?我怎么才能找出到底哪里出了问题呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-04-17 12:49:12

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

以下是您的错误:

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

下面是正确的函数(稍有改进):

代码语言:javascript
复制
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
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/759892

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档