Schrift
[thread]7018[/thread]

IPC zwischen zwei Skripten



<< >> 4 Einträge, 1 Seite
jherz
 2005-05-29 14:27
#55153 #55153
User since
2005-05-29
2 Artikel
BenutzerIn
[default_avatar]
Hallo Experten,

gestern hatte ich mich mal an etwas schwierigeres gemacht - und scheiterte prompt. Ich hoffe, daß jemand von euch mir helfen kann - und daß die Textmenge hier nicht abschreckend wirkt.

Ich habe zwei Perl-Skripte, die beide durchlaufen sollen, d.h. keines von beiden kann ständig beendet und wieder gestartet werden.

Skript 1 wartet als Dämon auf bestimmte Ereignisse und soll die dann Skript 2 melden, das einen Alert per Instant Messaging versenden soll.

Beides für sich läuft schön. Mein Problem ist nun, der Austausch der Meldung. Ich hatte mich entschieden, Skript 2 am Anfang von Skript 1 aus per
Code: (dl )
open INFORMANT, "| ./informat.pl";

zu starten. Jenes soll dann meiner Vorstellung nach loopen und wenn es was auf STDIN gibt, den alert senden.
Grob gesagt sieht der Code so aus:

Code: (dl )
1
2
3
4
5
6
7
while(1) {
while (<STDIN>) {
sendalert($_);
}

listen_to_IM_server();
}


Tja, nur dummerweise blockt Perl an "while (<STDIN>)" solange Skript 1 das Filehandle offen hat. Und von daher stehe ich nun dumm da.

Meine Fragen nun ist zweiteilig:
1. Gibt es irgendeine Möglichkeit, <STDIN> nichtblockend zu bekommen? D.h. einfach weitergehen wenn keine Bytes (bzw. keine Zeile, d.h. mit \n) anliegt.
2. Gibt es insgesamt eine bessere Lösung für mein Problem als per anonymer Pipe?

Die Datenübergabe per File und Signalisierung über SIGHUP habe ich auch schon probiert. Nur ist mir das sowieso zuwieder (wegen ein paar Byte ständig File auf und zu samt Probleme des gleichzeitigen Zugriffs) und zweitens kriege ich den HUP nicht an Skript 2 abgesetzt.

Grüße,
Jürgen\n\n

<!--EDIT|jherz|1117364948-->
pktm
 2005-05-29 18:09
#55154 #55154
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Dubu
 2005-05-29 20:58
#55155 #55155
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
jherz
 2005-05-29 21:00
#55156 #55156
User since
2005-05-29
2 Artikel
BenutzerIn
[default_avatar]
So, ich hab's nach weiteren Stunden, Blut, Schweiß und Tränen hingekriegt.

Und nur für den Fall, daß wieder mal jemand nach sowas sucht, hier was gefehlt hat:

Das aufrufende Skript beantragt nach dem Öffnen autoflushing der in die Pipe geschriebenen Daten:
Code: (dl )
INFORMANT->autoflush(1);


Das aufgerufene Skript erklärt STDIN zu nichtblockend:
Code: (dl )
1
2
use Fcntl;
fcntl(STDIN, F_SETFL, O_NONBLOCK) or die "can't set non blocking: $!";


Damit funktioniert es genauso wie erwartet.

Jürgen
<< >> 4 Einträge, 1 Seite



View all threads created 2005-05-29 14:27.