Schrift
[thread]7086[/thread]

Sockets verwalten oder aufrufende Sub herausfinden: Welche sub ruft meine sub auf?



<< >> 3 Einträge, 1 Seite
Echelon1010000
 2005-06-29 16:16
#55820 #55820
User since
2005-06-29
18 Artikel
BenutzerIn
[default_avatar]
Hi

Ich schreibe gerade an einem Script das diverse systembezogene Daten ( Temperatur, Last etc.) einsammelt und diese dann an ein Tool namens "lcdproc" weiterreicht. Letzteres geschieht über eine TCP Verbindung. Die Daten werden dann auf einem LCD angezeigt.

Ich bin bisher so vorgegangen das mein Script den Socket zu lcdproc aufmacht und dann für die verschiedenen Bereiche einzelne Subprozesse geforked werden, die dann jeweils bestimmte Daten holen und über den Socket an lcdproc weiterreichen.
Das hat auch ganz funktioniert, aber als ich mein drittes Modul fertig hatte kamen die Probleme: Die Module kamen sich gegenseitig beim Arbeiten mit dem Socket in die Quere. Verzögerungen von mehrereren Sekunden waren die Folge (blöd wenn Daten in Echtzeit dargestellt werden sollen), Antworten vom Server konnten nicht mehr zugeordnet werden, bis hin zum kompletten hängen des Programms weil alle Unterprogramme auf den freien Socket warten wollten.

Ich hab mich dann entschlossen die Sache umzustricken und für jedes Modul einen eigenen Socket zu erzeugen. Das passiert alles lokal auf 127.0.0.1, ist also nicht so tragisch. Jetzt stehe ich vor einem neuen Problem: Die Module greifen auf eine Sammlung subs zurück die die eigentliche Kommunikation zwischen lcdproc und meinem Programm übernehmen. Diese subs haben bisher auf den global verfügbaren Socket geschrieben was jetzt natürlich nicht mehr geht.

Ich habe mir das so vorgestellt das ich vor dem forken die Sockets erzeuge und in einem Array ablege. Anschließend kann das Unterprogramm wie gewohnt die sub aufrufen. Die sub ermittelt dann von wo sie aufgerufen wurde und schreibt dann automatisch auf den richtigen Socket.

Mein Problem: Wie kann ich innerhalb der sub herausfinden aus welcher (anderen) sub diese aufgerufen wurde?
Im Endeffekt soll es so aussehen: (Pseudocode)
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#!/usr/bin/perl -w
# Init
use blah;
use blubb;

# erzeuge sockets für jedes unterprogramm
our @sockets=();
# sockets erzeugen
for ($i=0;$i<5;$i++)
{
$sockets[$i]=create_connection();
}

# unterprogramme starten
startmodul1();
startmodul2();
...
...
...

# sub um daten aufs LCD zu bringen
sub data2lcd
{
my $socket=();
my $parameter=shift;
# herausfinden wer uns aufruft
my $caller=get_calling_sub();
if ( $caller="modul1") { $socket=$sockets[0];}
if ( $caller="modul2") { $socket=$sockets[1];}
if ( $caller="modul3") { $socket=$sockets[2];}
print $socket "Blah $parameter";
return 1;
}

sub startmodul1
{
# forken
my $pid=fork();
if ($pid==0)
{
MODUL1LOOP:
#daten einsammeln
my $data=fetchdata();
my $data2=fetchotherdata();
# daten zum lcd schicken
data2lcd($data);
data2lcd(data2)
sleep (10);
goto MODUL1LOOP
}
return 1;
}
...
...
...
MAINLOOP:
# tue irgendwas
blah();
goto mainloop;


Vielleicht versteht ja einer was ich vorhab und kann mir helfen. Mir fehlt genau der Teil wie ich herausfinde welche sub die aufrufende sub ist um den Socket richtig zuordnen zu können. Die Alternative wäre die Funktionssammlung für jedes Unterprogramm einzeln zu implementieren, das würde ich jedoch gerne Vermeiden...

Für jeden Tip dankbar,
Gruss, Echelon
esskar
 2005-06-29 16:20
#55821 #55821
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
du warst schon ganz nah! :)

perldoc -f caller

Code: (dl )
1
2
my ($package, $filename, $line, $subroutine, $hasargs,
$wantarray, $evaltext, $is_require, $hints, $bitmask) = caller(1);
Echelon1010000
 2005-06-29 16:25
#55822 #55822
User since
2005-06-29
18 Artikel
BenutzerIn
[default_avatar]
Hi!

Klasse, da kann man doch was draus basteln, und das auch noch fast sofort :)

Gruß,
Echelon
<< >> 3 Einträge, 1 Seite



View all threads created 2005-06-29 16:16.