Forum: PC-Programmierung IPC in C (Signa/Event?)


von AKE (Gast)


Lesenswert?

Hallo,

ich habe zwei Programme in C geschrieben die nur auf Linux laufen 
sollen. Nun will ich wenn ich Programm 1 ein bestimmtes Ereignis 
eintritt dem Programm 2 dieses mitteilen. Programm 2 soll hierfür kurz 
aus dem gewohnten gerissen werden (Interrupt) und danach dort weiter 
machen, wo es war.

Erste Frage: Nennt man das Event oder Singal oder ganz anders?

Dazu habe ich Inter process communication gefunden.
Sockets, SharedMemory usw.

Nun würde ich Sockets verwenden um die beiden Programm ggf. auf 
unterschiedlichen Rechnern laufen lassen zu könne.

Nun zu meinem Problem:
Ich würde das gerne wie oben schon erwähnt über Events? Signale? lösen.
Nach was suche ich hier? :)

Würde mich sehr über ein paar Stichworte freuen, die ich googlen kann.

: Verschoben durch User
von Felix U. (ubfx)


Lesenswert?

Du könntest theoretisch ein Signal an den anderen Prozess senden, und in 
diesem einen signal handler registrieren, der darauf wartet.

http://man7.org/linux/man-pages/man3/sigqueue.3.html
http://man7.org/linux/man-pages/man2/sigaction.2.html

Oder du machst es mit Sockets, die lösen aber nicht direkt Events oder 
Signale aus. Da musst du dann entweder in deinem Main Thread immer 
wieder das Socket abfragen (poll), oder einen eigenen Thread starten, 
der blockt bis Daten auf dem Socket ankommen und dann vom Kernel 
aufgeweckt wird (blocking sockets).

von Rolf M. (rmagnus)


Lesenswert?

AKE schrieb:
> Hallo,
>
> ich habe zwei Programme in C geschrieben die nur auf Linux laufen
> sollen. Nun will ich wenn ich Programm 1 ein bestimmtes Ereignis
> eintritt dem Programm 2 dieses mitteilen. Programm 2 soll hierfür kurz
> aus dem gewohnten gerissen werden (Interrupt) und danach dort weiter
> machen, wo es war.
>
> Erste Frage: Nennt man das Event oder Singal oder ganz anders?

Antwort: Ja. ;-)
Ausführlichere Antwort: Es gibt verschiedene Möglichkeiten. Signale und 
Events gehören dazu.

> Dazu habe ich Inter process communication gefunden.
> Sockets, SharedMemory usw.
>
> Nun würde ich Sockets verwenden um die beiden Programm ggf. auf
> unterschiedlichen Rechnern laufen lassen zu könne.

Wenn diese Anforderung besteht, sind Sockets eine sinnvolle Wahl.

Felix U. schrieb:
> Oder du machst es mit Sockets, die lösen aber nicht direkt Events oder
> Signale aus.

Können sie auch. Der Socket kann auch so eingerichtet werden, dass er 
bei Empfang von Daten das Signal SIGIO oder alternativ auch ein anderes 
ausgelöst. Siehe man 7 socket.

von Daniel A. (daniel-a)


Lesenswert?

AKE schrieb:
> Ich würde das gerne wie oben schon erwähnt über Events? Signale? lösen.
> Nach was suche ich hier? :)

Es gibt 2 möglichkeiten. Wenn du eine Art main loop hast, kannst du mit 
select prüfen ob das Lesen von einem filedescriptor nicht blockiert, und 
dann die Eingabe verarbeiten. Alternativ könnte man beim Filedescriptor 
das O_ASYNC flag setzen, einen Signal handler für SIGIO registrieren, 
und dann mit select nachsehen bei welchem Filedescriptor Daten verfügbar 
sind.  Falls du eine art Event-loop in der Anwendung hast, könnte man 
nach dem Empfangen & lesen der Daten daraus natürlich auch ein Event 
generieren, aber das wäre dann schon eine Abstraktion der Anwendung. 
Achte einfach darauf, dass das Programm schläft wären es nichts macht, 
und nicht sinnlos CPU verbraucht.

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.