Schrift
[thread]9087[/thread]

IPC



<< |< 1 2 >| >> 13 Einträge, 2 Seiten
weismat
 2007-06-14 12:40
#77521 #77521
User since
2003-08-18
142 Artikel
BenutzerIn
[default_avatar]
Welche Erfahrungen habt Ihr mit den verschiedenen Modulen für IPC unter Solaris/Linux gemacht? Ich moechte gerne Daten zwischen mehreren Prozessen austauschen.
Ich denke dabei gerade über CPAN:IPC::Shareable oder CPAN:IPC::ShareLite nach, oder gibt es noch bessere Alternativen?
sid burn
 2007-06-14 13:51
#77522 #77522
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
Pipes, Unix Sockets oder Internet Sockets.
Dateien (Datenbanken). ;)\n\n

<!--EDIT|sid burn|1181814738-->
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
bloonix
 2007-06-14 14:05
#77523 #77523
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
@sid, du hast mir meine Antwort geklaut :)

@weismat, CPAN:IO::Socket + CPAN:Storable

Shared Memory Foo wäre auch noch ne Möglichkeit, aber ob das auf allen
Plattformen klappt... dunno.
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
weismat
 2007-06-14 14:32
#77524 #77524
User since
2003-08-18
142 Artikel
BenutzerIn
[default_avatar]
Mit Sockets wird das alles komplizierter.
Ich möchte mehrere Prozesse, die an einen anderen Prozess Nachrichten schicken sollen. Dabei sollen die Sender auch arbeiten, wenn ich den Empfänger herunterfahre....deswegen mag ich die Sockets nicht so sehr.
Wie würde das mit Pipes funktionieren?
bloonix
 2007-06-14 15:50
#77525 #77525
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
[quote=weismat,14.06.2007, 12:32]Mit Sockets wird das alles komplizierter.[/quote]
Warum denn das? Einmal fertig geschrieben ist es egal, wo die Prozesse
laufen, lokal oder auf unterschiedlichen Maschinen.

[quote=weismat,14.06.2007, 12:32]Ich möchte mehrere Prozesse, die an einen anderen Prozess Nachrichten schicken sollen. Dabei sollen die Sender auch arbeiten, wenn ich den Empfänger herunterfahre....deswegen mag ich die Sockets nicht so sehr.[/quote]
Das ist doch auch über Sockets kein Problem. Ob dein Empfänger nun in
einer Pipe nachschaut oder auf dem Socket, ob was reinkommt...

[quote=weismat,14.06.2007, 12:32]Wie würde das mit Pipes funktionieren?[/quote]
Erstelle einfach für jeden Sender eine Pipe, so kann auch sichergestellt
werden, dass die Sender nicht alle zeitgleich senden und der Empfänger
nicht weiß, von wem welche Daten kommen. Der Empfänger schaut dann
alle paar Sekunden nach, ob in irgendeiner Pipe was ansteht.

Beispiel:

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
60
61
62
63
64
65
66
use strict;
use warnings;

package Sender;
use Fcntl;

sub run {
  my ($class, $pipe) = @_;
  print STDOUT "Sender $$ wurde gestartet\n";

  while ( 1 ) {
     sysopen my $fh, $pipe ,O_WRONLY or die $!;
     print $fh "Hello World from $$\n";
     close $fh;
     sleep 10;
  }
}

package Empfaenger;
use Fcntl;
use IO::Select;

sub run {
  my ($class, $pipes) = @_;
  my $io = IO::Select->new;
  my %handles;

  for my $p (@$pipes) {
     sysopen my $fh, $p, O_RDONLY or die $!;
     $handles{$fh} = $p;
     $io->add($fh);
  }

  print STDOUT "Empfaenger wurde gestartet\n";

  while ( 1 ) {
     my @ready = $io->can_read(2);

     for my $fh (@ready) {
        print STDOUT "Receiving data from pipe $handles{$fh}\n";
        print while <$fh>;
     }

     sleep 10;
  }

}

package main;
use POSIX qw/mkfifo/;

my @pipes;

for my $pipe (1..5) {
  mkfifo($pipe, 0600) or die $!;
  my $pid = fork;

  if ($pid) { # Empfaenger
     push @pipes, $pipe;
  } else { # Sender
     Sender->run($pipe);
     exit;
  }
}

Empfaenger->run(\@pipes);


Es werden 5 Pipes erzeugt: 1 2 3 4 und 5
Die Pipes müssen manuel gelöscht werden... da kannst du dir ja was
einfallen lassen :)\n\n

<!--EDIT|opi|1181832300-->
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
betterworld
 2007-06-14 22:20
#77526 #77526
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
[quote=opi,14.06.2007, 13:50][quote=weismat,14.06.2007, 12:32]Ich möchte mehrere Prozesse, die an einen anderen Prozess Nachrichten schicken sollen. Dabei sollen die Sender auch arbeiten, wenn ich den Empfänger herunterfahre....deswegen mag ich die Sockets nicht so sehr.[/quote]
Das ist doch auch über Sockets kein Problem. Ob dein Empfänger nun in
einer Pipe nachschaut oder auf dem Socket, ob was reinkommt...[/quote]
Das Problem ist wohl eher, dass die Sender irgendwann blocken, wenn der Empfänger keine Nachrichten mehr abholt
bloonix
 2007-06-14 22:26
#77527 #77527
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
[quote=betterworld,14.06.2007, 20:20]Das Problem ist wohl eher, dass die Sender irgendwann blocken, wenn der Empfänger keine Nachrichten mehr abholt[/quote]
Dafür könnte man einen Timeout setzen.
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
weismat
 2007-06-15 08:49
#77528 #77528
User since
2003-08-18
142 Artikel
BenutzerIn
[default_avatar]
Ich denke, daß ich UDP statt TCP nehmen werde, da ich ein verbindungsloses Protokoll nehmen möchte, da ich nie weiß, ob ich einen der Sender oder den Receiver intraday neu starten möchte.
bloonix
 2007-06-15 12:43
#77529 #77529
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Also möchtest du jetzt doch mit Sockets arbeiten? Hast du mein Beispiel
denn mal ausprobiert und es verstanden?
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
weismat
 2007-06-16 09:28
#77530 #77530
User since
2003-08-18
142 Artikel
BenutzerIn
[default_avatar]
Ich habe Deinen Vorschlag angeschaut - danke nochmals dafür.
Polling scheidet für mich aus, weil ich sekündlich Daten beziehen und verarbeiten muss. Es lief schon vorher über über Sockets über einen Server, aber der Server wurde manchmal zum Flaschenhals.\n\n

<!--EDIT|weismat|1182000656-->
<< |< 1 2 >| >> 13 Einträge, 2 Seiten



View all threads created 2007-06-14 12:40.