Schrift
[thread]6861[/thread]

Funktion im Eltern-Prozess ansprechen?: doch per fork?



<< |< 1 2 >| >> 15 Einträge, 2 Seiten
Froschpopo
 2005-04-07 05:23
#53490 #53490
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
Ich hab ein fork:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/usr/bin/perl
$|++;

my $pid = fork();    

unless($pid) {
 while(1..) {
       prozess_bei_den_eltern();
 }
 CORE::exit;
}

sub prozess_bei_den_eltern {
    # hier sind wir wieder bei den Eltern
}

Anscheinend wird prozess_bei_den_eltern() auch mit geforked.

Meine Frage: Wie kann ich ohne eine Pipe eine Funktion bei den Eltern aufrufen?
Ich brauche keine wirkliche Kommunikation zwischen Kind und Eltern, es genügt wenn das kind ne Funktion bei den Eltern ansteuern kann. Rückgabewerte werden ebenfalls nicht benötigt.

prozess_bei_den_eltern() darf nicht geforked werden weil dort Tk-Funktionen arbeiten.

Keine Sorge, ich interessiere mich nach wie vor für POE, möchte aber jetzt gerne doch wissen ob es sowas gibt...\n\n

<!--EDIT|Froschpopo|1112837249-->
esskar
 2005-04-07 05:30
#53491 #53491
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
nein;
ein fork erzeugt einen neuen Prozess; der neue Prozess ist ab dann eigenständig und hat im Grunde nichts mehr mit dem aurufenden Prozess zu tun; ist quasi ein neues Programm, nur das der neue Prozess schon genauso viel weiß, wie sein Papa.
Froschpopo
 2005-04-07 05:37
#53492 #53492
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
hier mein 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
#!/usr/bin/perl
$|++;

use Tk;
my $pid = fork();

unless($pid) {
while(1..5) {
sleep(1);
prozess_bei_den_eltern("$_");
}
CORE::exit;
}

my $window = MainWindow->new();

$window->Label(-text=>'')->pack();

sub prozess_bei_den_eltern {
$window->configure(-text => $_[0]);
}

MainLoop;

es gibt keine Fehlermeldung. Allerdings auch nicht das was ich haben will. Theoretisch müsste sich doch jede Sekunde der text in dem Label ändern. Warum geschieht das nicht ? Ich hab die perldoc zu Tk gelesen, configure ist richtig !
esskar
 2005-04-07 05:42
#53493 #53493
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
sag mal, hab ich mich irgendwie undeutlich ausgedrückt...
es geht nicht!!!!
Froschpopo
 2005-04-07 05:53
#53494 #53494
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
und gibts da nicht möglichkeiten auf den Speicherbereich der Eltern zuzugreifen?
esskar
 2005-04-07 05:56
#53495 #53495
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
[quote=Froschpopo,07.04.2005, 03:53]und gibts da nicht möglichkeiten auf den Speicherbereich der Eltern zuzugreifen?[/quote]
nope.
benutz doch pipes!
Froschpopo
 2005-04-07 05:59
#53496 #53496
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
da sind wir jetzt wieder beim alten Thema: Wie kann eine Tk-Programm ne Pipe abhören ohne einzufrieren? Das Kind sendet ja zu einem späteren, unbekannten Zeitpunkt an den Vater. Ohne ne Schleife geht das nicht...\n\n

<!--EDIT|Froschpopo|1112839317-->
esskar
 2005-04-07 06:15
#53497 #53497
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
doch...
nimm IO::Select...
wenn du mir deinen code zeigst, bau ich es dir ein...
Froschpopo
 2005-04-07 06:31
#53498 #53498
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/usr/bin/perl
$|++;

my $pid = fork();

pipe(READER, WRITER);

unless($pid) {
  while(1..) {
      print READER "Text vom Kind";
      sleep(1);
  }
  CORE::exit;
}
for(<READER>) {
 print "Das Kind schreibt: $_\n";
}
close(READER);

# !!!was hier folgt wird nichtmehr ausgeführt !!!

So #ähnlich sieht das aus was eben nicht funktioniert. Ich würde das jetzt gerne ohne Pipe machen

Ich hab mir grad mal die perldoc zu IO::Pipe durchgelesen, auch die kommt nicht ohne eine while aus.\n\n

<!--EDIT|Froschpopo|1112842474-->
esskar
 2005-04-07 07:26
#53499 #53499
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
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
#!/usr/bin/perl
$|++;

use strict;
use warnings;

use IO::Pipe;
use IO::Select;

my $pipe = IO::Pipe->new;

my $pid = fork();

unless($pid) {
    $pipe->writer;
    $pipe->autoflush(1);

     for (1..2) {
         $pipe->print("Text vom Kind\n");
         sleep(2);
     }

} else {
    $pipe->reader;
    $pipe->autoflush(1);

   my $select = IO::Select->new($pipe);

   while(1) {
       if(my @handles = $select->can_read(0)) {
           foreach (@handles) {
               my $line = $_->readline;
               print "Das Kind schreibt: $line\n";
           }
       }
       print "Papa arbeitet.\n";
       sleep(1);
   }
}
\n\n

<!--EDIT|esskar|1112844404-->
<< |< 1 2 >| >> 15 Einträge, 2 Seiten



View all threads created 2005-04-07 05:23.