[LINUX/C] Auf irq warten

ich habe eine isa ksrte mit 16 ein- und ausgängen.

da man bei dieser karte einen irq einstellen kann, der aktiviert
wird wenn an den eingängen etwas passiert, würde ich gerne
wissen, wie man auf so einen interrupt warten kann!

danke!

Interruptbehandlung in Linux kann nur durch Kernel-Treiber erfolgen. Ubere die Programmierung solcher Treiber und wie das im einzelnen funktioniert, gibt es ein gutes Buch von Rubini, erschienen im O’Reilly Verlag.

Gruss

Joern

Hi,

Interruptbehandlung in Linux kann nur durch Kernel-Treiber
erfolgen. Ubere die Programmierung solcher Treiber und wie das
im einzelnen funktioniert, gibt es ein gutes Buch von Rubini,
erschienen im O’Reilly Verlag.

??? Also ich habe da mal was gemacht, und der Kernel hatte damit nichts zu tun. Ich kann mich leider kaum erinnern, darum habe ich nicht gleich geantwortet. Aber man kann einen C-Lib verwenden (signal.h?) und muss dann eine bestimmte Funktion definieren, die als argument glaube ich einen Funktionspointer annehmen muss. Mit dieser Funktion kann man dann Interrupts behandeln (man kann z.B. SIGSEG abfangen, sogar auch SIGTERM, nicht aber SIGKILL). Es gibt auch einige Interrupts, die vom Kernel nicht belegt sind und von Programmen zur Kommunikation verwendet werden koennen (ich meine man kann auch Interupts ausloesen, das habe ich aber nicht verwendet). Haariger wirds mit Semaphoren. Andere Moeglichkeiten zur Kommunikation zwischen Programmen sind named pipes (auf nicht voellig veralteten Systemen mit poll.h, auf aelteren Systemen muss man was anderes verwenden, hab vergessen wie es hiess, damit laesst sich uebrigens ein sleep() mit hoher zeitlicher Aufloesung implementieren) und das Prog-System (letzteres wieder haarig). Nachzulesen ist das alles in dem Buch Programming in the Unix Environment (?).
Am angenehmensten ist mulithreading uebrigens in Java zu implementieren, da ist es ein Kinderspiel!
Sorry, dass ich das nicht besser auf die Reihe kriege …

Gruss

Thorsten

??? Also ich habe da mal was gemacht, und der Kernel hatte
damit nichts zu tun. Ich kann mich leider kaum erinnern, darum
habe ich nicht gleich geantwortet. Aber man kann einen C-Lib
verwenden (signal.h?) und muss dann eine bestimmte Funktion
definieren, die als argument glaube ich einen Funktionspointer
annehmen muss. Mit dieser Funktion kann man dann Interrupts
behandeln (man kann z.B. SIGSEG abfangen, sogar auch SIGTERM,
nicht aber SIGKILL).

Das sind ja auch keine Interrupts sonder Signale zwischen Pozessen, die kann man selbstverstaendlich auch im User-Space verwenden. Allerdings um die Reaktion auf einen Hardware-Interrupt in ein Signal umzusetzen, dazu muss die Software (der Treiber) im Kernel-Space laufen.

Es gibt auch einige Interrupts, die vom
Kernel nicht belegt sind und von Programmen zur Kommunikation
verwendet werden koennen (ich meine man kann auch Interupts
ausloesen, das habe ich aber nicht verwendet). Haariger wirds
mit Semaphoren. Andere Moeglichkeiten zur Kommunikation
zwischen Programmen sind named pipes (auf nicht voellig
veralteten Systemen mit poll.h, auf aelteren Systemen muss man
was anderes verwenden, hab vergessen wie es hiess, damit
laesst sich uebrigens ein sleep() mit hoher zeitlicher
Aufloesung implementieren) und das Prog-System (letzteres
wieder haarig). Nachzulesen ist das alles in dem Buch
Programming in the Unix Environment (?).

Das Buch heisst „Advanced Programming in the UNIX Environment“, aber das behandelt die Reaktion auf Hardware-Interrupts nicht, sondern nur die IPC.
Aber hier geht es wirklich um die Behandlung von Hardware-Signalen (hat nix mit SIGINT zu tun). Sicher koennte man auch die entsprechenden Signale auf der Karte abfangen und die Karte regelmaessig pollen, aber auch dies muesste im Kernel-Space passieren.

Joern

Hi,

sorry, ich hatte den urspruenglichen Artikel vor ein paar Tagen gelesen, und das nicht mehr wiederholt, bevor ich auf Deinen geantwortet habe - haette ich tun sollen. Du hast natuerlich recht. Ich hatte - falsch - in Erinnerung, dass es um kommunizierende Applikationen ging …

Gruss

Thorsten

Schlusswort?
Ich denke dass es doch etwas overkill ist, wenn ich zu diesem zweck ein kernelmodul schreibe…
am einfachsten ist es wohl die karte ein paar mal in der sekunde abzufragen.
trotzdem danke