1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/usr/bin/perl
use strict;
if(my $pid = fork()) {
for (0..5) {
print "original: " . $_ . "\n";
sleep(1);
}
}
else {
for (0..10) {
print "forked: " . $_ . "\n";
sleep(1);
}
}
print "exiting\n";
exit;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
jan@jlubuntu ~/www/test/forktest $ perl fork.pl
original: 0
forked: 0
original: 1
forked: 1
original: 2
forked: 2
original: 3
forked: 3
original: 4
forked: 4
original: 5
forked: 5
exiting
forked: 6
jan@jlubuntu ~/www/test/forktest $ forked: 7
forked: 8
forked: 9
forked: 10
exiting
1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/perl
use strict;
system("./2.pl &");
for (0..5) {
print "1: " . $_ . "\n";
sleep(1);
}
print "exiting\n";
exit;
1
2
3
4
5
6
7
8
9
#!/usr/bin/perl
use strict;
for (0..10) {
print "2: " . $_ . "\n";
sleep(1);
}
print "exiting\n";
exit;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
jan@jlubuntu ~/www/test/forktest $ perl 1.pl
jan@jlubuntu ~/www/test/forktest $ perl 1.pl
1: 0
2: 0
1: 1
2: 1
1: 2
2: 2
1: 3
2: 3
1: 4
2: 4
1: 5
2: 5
exiting
jan@jlubuntu ~/www/test/forktest $ 2: 6
2: 7
2: 8
2: 9
2: 10
exiting
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
#!/usr/bin/perl use strict; use warnings; use diagnostics; use Fcntl qw(:DEFAULT :flock); my $pid; if ($pid = fork()) { # Eltern brauchen wir nicht mehr print STDOUT 'Laeuft...'; exit(); } else { # Kind muss arbeiten sleep(10); sysopen(my $fh,'test_fork_sohn.txt',O_WRONLY|O_APPEND|O_CREAT); print $fh 'hier bin ich nach 10 Sekunden'; exit(); }
2013-11-01T10:59:49 janUnter welchem Linux hast Du's probiert?
1
2
3
4
5
6
REQ>lsb_release -a
RES>
Distributor ID: Debian
Description: Debian GNU/Linux unknown
Release: unknown
Codename: n/a
2013-11-01T11:12:28 janwas sagt /etc/debian_version?
2013-11-01T11:12:28 janREQ>
RES>
sieht etwas merkwürdig aus, bist du denn per konsole drauf oder führst Du das per cgi o.ä. aus? Da kann's dann sein, dass der Webserver auf Child-Prozesse wartet.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
#!/usr/bin/perl use strict; use warnings; use diagnostics; use Fcntl qw(:DEFAULT :flock); my $pid; if ($pid = fork()) { # Eltern brauchen wir nicht mehr print STDOUT 'Laeuft...'; close STDOUT; close STDERR; exit(); } else { # Kind muss arbeiten sleep(10); sysopen(my $fh,'test_fork_sohn.txt',O_WRONLY|O_APPEND|O_CREAT); print $fh 'hier bin ich nach 10 Sekunden'; exit(); }
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 strict;
use warnings;
use diagnostics;
use Fcntl qw(:DEFAULT :flock);
print "Content-type: text/plain\n\n";
my $pid;
if ($pid = fork()) {
# Eltern brauchen wir nicht mehr
print STDOUT 'Laeuft...';
close STDOUT;
close STDERR;
exit();
}
else {
close STDOUT;
close STDERR;
# Kind muss arbeiten
sleep(10);
sysopen(my $fh,'test_fork_sohn.txt',O_WRONLY|O_APPEND|O_CREAT);
print $fh 'hier bin ich nach 10 Sekunden';
exit();
}
QuoteFilehandle STDERR reopened as $datei only for input at /meinscript.pl line xx.
2013-11-05T11:24:27 janprobier doch mal, das große script so weit zu vereinfachen, dass es nur den Fehler reproduziert. So ist es in der Tat nur herumstochern im Nebel.
2013-11-05T11:31:12 pq
2013-11-05T17:12:11 pqda ich nicht sehe, wo du das no warnings plazierst, kann ich da auch nix zu sagen.
1 2 3 4 5 6
close STDOUT; open my $fh, "<", "/tmp/testfile"; warn fileno($fh); __END__ Filehandle STDOUT reopened as $fh only for input at -e line 3. 1 at -e line 4.
1 2 3 4 5 6
close STDOUT; no warnings "io"; open my $fh, "<", "/tmp/testfile"; warn fileno($fh); __END__ 1 at -e line 5.
2013-11-05T18:54:15 pqwarum sollte man warnings also nicht genau davor abschalten?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
# Meckern bis das Kamel stirbt use warnings; sub Foo { # hier nicht rumbrüllen wegen IO no warnings "io"; } if ($bool) { if (42) { # hier nicht rumbrüllen wegen IO no warnings "io"; } }
2013-11-01T19:39:33 topegWollten die PerlPorter Windows 100% unterstützen bräuchte man ein Dutzend verschiedenen Executables, um die verschiedenen Windowsversionen und Interfaces zu unterstützen.
2013-11-01T19:39:33 topegWürden sich die Windows Entwickler dazu durchringen ein POSIX Konformes Interface einzubauen, gäbe es die ganzen Probleme nicht.
2013-11-01T19:39:33 topegBis dahin kann man Cygwin nutzen und damit ein perl mit fork. Dafür funktionieren die Win32 Module aber nicht...
2013-11-02T09:42:25 topegMan kann eine Anbindung ohne Abhängigkeiten schreiben. Die verschiedenen ABIs sind definiert. Aber der Aufwand ist nicht gering.