Thread IPC (12 answers)
Opened by weismat at 2007-06-14 12:40

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.

View full thread IPC