Syscalls mit Python

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

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
BlackJack

Sonntag 29. Juli 2007, 18:16

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()
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

Montag 30. Juli 2007, 02:55

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 :)
BlackJack

Montag 30. Juli 2007, 07:08

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?
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

Montag 30. Juli 2007, 15:15

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.
BlackJack

Montag 30. Juli 2007, 15:26

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".
Antworten