Thread Problem mit fork()
(24 answers)
Opened by bianca at 2015-09-05 20:15
Guten Morgen!
Nun wollte ich mittels eines Testscripts dem Perl v5.14.2 Hoster zeigen, wo das Problem liegt. Leider ist es nun so, dass dieses Testscript auf dem Perl v5.18.4 Server nun auch nur noch ungefähr jedes fünfte mal wie erwartet reagiert. Das Original Script hingegen verhält sich auf dem v5.18.4 nach wie vor wie erwartet. Das ist eine völlig neue Situation. Erwartet Reaktion: Quote Stattdessen kommt häufig (und genau das ist das Problem) dieses: Quote Getestet mit Firefox 40.0.3 auf Win 7 durch ständiges STRG R nach der Meldung "Fertig". Ungefähr jedes fünfte mal ist es ok, dazwischen wie eine Art "Puffer". Das Testscript benutzt exakt die selbe Syntax (sowohl Perl- wie auch JS-seitig) wie das Original bei dem mir der Fehler aufgefallen war und sieht so aus: Code (perl): (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 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 #!/usr/bin/perl use strict; use warnings; use CGI; use JSON; use Fcntl qw(:DEFAULT); use IO::Handle; STDOUT->autoflush(1); my $pfad = '/mein_pfad_zum/cgi-bin'; my $t = time(); if (defined $ARGV[0]) { unlink("$pfad/test_fork.txt"); if (sysopen(my $fh,"$pfad/test_fork.txt",O_WRONLY|O_APPEND|O_CREAT)) { $fh->autoflush(1); for (my $z = 0; $z < 10; $z ++) { print $fh "***Z-$z-".time()."\n"; sleep(1); } close($fh); } exit(); } my $cgi = new CGI; my $parameter = $cgi->param('parameter'); if (!defined $parameter) { print STDOUT CGI->new->header(-charset=>'ISO-8859-15').<<HTML_TEIL <!DOCTYPE html> <html> <head> <title>fork() Fehler</title> <script src="//ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script> <style type="text/css"> #fehler { padding-top: 20px; color: red; font-weight: bold; } #out { padding-top: 20px; } </style> </head> <body> <div id="fehler"><u>Fehler:</u></div> <div id="out"><u>Polling Ergebnisse:</u><br></div> <script> var ini = true; function aktualisieren() { document.getElementById('out').innerHTML += (ini ? 'Initialisierung' : 'Polling')+' wird ausgeführt...<br>'; var datapostobj = { parameter: (ini ? 'ini' : 'poll') }; console.log('Start Ajax mit Parameter "'+datapostobj['parameter']+'"'); jQuery.ajax({ url: '/cgi-bin/test_fork.pl', data: datapostobj, dataType: 'json', type: 'POST', cache: false, success: function(input) { console.log('Ergebnis ist da'); document.getElementById('out').innerHTML += (input['text'] != '' ? input['text'] : 'nix')+'<br>'; ini = false; if (input['text'].indexOf('Z-9') < 0) { window.setTimeout(function() { aktualisieren(); },1000); } else { document.getElementById('out').innerHTML += 'Fertig<br>'; } }, error: function(xhrobj,textStatus,errorThrown) { jQuery('#fehler').html('Verbindungsfehler textStatus: '+textStatus+' errorThrown: '+errorThrown); } }); } aktualisieren(); </script> </body> </html> HTML_TEIL ; } elsif ($parameter eq 'ini') { my $pid = fork(); # Fehler if (!defined $pid) { print STDOUT CGI->new->header(-charset=>'ISO-8859-15').time()." Fehler bei fork()\n"; } # Vater elsif ($pid) { my %out = (text => time().' Hier ist der Vater, terminiere jetzt ('.(time() - $t)." Sekunden)\n"); print STDOUT CGI->new->header(-charset=>'ISO-8859-15').JSON->new->encode(\%out); } # Sohn else { close STDIN; close STDOUT; exec("perl $pfad/test_fork.pl kommandozeile"); exit(); } } elsif ($parameter eq 'poll') { my %out = (text => ''); if (sysopen(my $fh,"$pfad/test_fork.txt",O_RDONLY)) { undef local $/; $out{text} = <$fh>; close($fh); } else { $out{text} = "Fehler '$!'"; } $out{text} .= ' ('.(time() - $t)." Sekunden)\n"; print STDOUT CGI->new->header(-charset=>'ISO-8859-15').JSON->new->encode(\%out); } @jan: ein Managed Server kann ich nicht bezahlen, hab ja keine Einnahmen damit. Weiß jemand, warum das mal wie erwartet klappt und mal nicht? Last edited: 2015-09-11 09:45:10 +0200 (CEST) 10 print "Hallo"
20 goto 10 |