Syscalls mit Python
Verfasst: Sonntag 29. Juli 2007, 16:04
Gibt es einen weg wie ich mit Python direkt einen Syscall machen kann (int 0x80)? Sowas wie syscall() in Perl.
Gruss,
Jonas
Gruss,
Jonas
Seit 2002 Diskussionen rund um die Programmiersprache Python
https://www.python-forum.de/
Code: Alles auswählen
from __future__ import division
from ctypes import (byref, CDLL, c_char, c_int, c_long, c_ulong, c_ushort,
Structure)
from ctypes.util import find_library
SYS_SYSINFO = 116
class SysInfo(Structure):
_fields_ = [('uptime', c_long),
('loads', c_ulong * 3),
('totalram', c_ulong),
('freeram', c_ulong),
('sharedram', c_ulong),
('bufferram', c_ulong),
('totalswap', c_ulong),
('freeswap', c_ulong),
('procs', c_ushort),
('dummy', c_char * 22)]
def main():
libc = CDLL(find_library('c'))
syscall = libc.syscall
syscall.argtypes = (c_int,)
sysinfo = SysInfo()
print syscall(SYS_SYSINFO, byref(sysinfo))
print '%d:%02d uptime\n' % divmod(sysinfo.uptime / 60, 60)
for memory_type, total, free in (('RAM',
sysinfo.totalram,
sysinfo.freeram),
('swap',
sysinfo.totalswap,
sysinfo.freeswap)):
print '%d %s, %d free (%d%%)' % (total,
memory_type,
free,
free / total * 100)
if __name__ == '__main__':
main()
Nicht optimal ist das ich ctypes dazu brauche und ich geglaubt habe das ctypes eine gute menge Speicher verbraucht. Entweder bin ich nicht fähig zu messen, ctypes ist in python integriert oder es braucht fast keinen Speicher.BlackJack hat geschrieben:Das war aus einem Beispiel von Perl's `syscall()` übersetzt. Ich wollte halt irgendetwas nehmen, was sowohl ein Argument entgegennimmt, als auch etwas zurückliefert.
Was ist denn daran nicht optimal? Perl's `syscall()` funktioniert doch so ähnlich. Man müsste sich nur noch die ganzen Konstanten für die Syscalls aus den Linux-Headern ziehen und schon hat man einen Klon der Funktion.
Was wolltest Du denn genau machen?
Code: Alles auswählen
In [52]: ctypes
Out[52]: <module 'ctypes' from '/usr/lib/python2.5/ctypes/__init__.pyc'>
In [53]: sys
Out[53]: <module 'sys' (built-in)>