Seite 1 von 1

Syscalls mit Python

Verfasst: Sonntag 29. Juli 2007, 16:04
von veers
Gibt es einen weg wie ich mit Python direkt einen Syscall machen kann (int 0x80)? Sowas wie syscall() in Perl.

Gruss,
Jonas

Verfasst: Sonntag 29. Juli 2007, 18:16
von BlackJack
Darf es auch indirekt über die C-Bibliothek gehen? Dann geht's mit `ctypes`:

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()

Verfasst: Montag 30. Juli 2007, 02:55
von veers
Nicht optimal aber tut was ich will. Jedoch kann ich da gleich die Funktionen (eg. sysinfo) aus der libc aufrufen.

Aber ich stelle gerade mein Vorhaben sendfile() aus Python heraus zu verwenden stark in Frage :)

Verfasst: Montag 30. Juli 2007, 07:08
von BlackJack
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?

Verfasst: Montag 30. Juli 2007, 15:15
von veers
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?
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.

Was ich machen wollte ist einen integrierten Webserver Dateien über sendfile() senden zu lassen da mir das Kopieren über einen iterator böse ineffizient zu sein scheint. Aber um ehrlich zu sein, es geht vor allem um Neugierde.

Verfasst: Montag 30. Juli 2007, 15:26
von BlackJack
Integriert im Sinne von fest einkompiliert ist es nicht. Zum Beispiel im Gegensatz zum `sys`-Modul:

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)>
Aber wofür sollte das Modul viel Speicher benötigen? Ist doch letztendlich nur eine recht dünne Schicht zwischen Python und "shared libraries".