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 ()의 인수에 대한 자세한 정보는 찾을 수 있습니다. 여기.
오류는 다음과 같습니다.
- 당신은 잊었습니다 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
제휴하지 않습니다 StackOverflow