Schrift
[thread]8454[/thread]

fork()

Leser: 6


<< |< 1 2 >| >> 14 Einträge, 2 Seiten
HuberDe
 2006-10-27 10:44
#71204 #71204
User since
2006-10-26
15 Artikel
BenutzerIn
[default_avatar]
Hallo,

bei einem fork() in Perl bekomme ich eine negative Pid zurück? So wie ich das aus meinem Perl Buch entnehmen kann gehört diese aber zu einer Prozessgruppe, nicht zum Prozess selber? Wenn ich mir beim fork die rückgabe des forks in eine variable schreibe und dann sage "kill $variable" wird der Prozess auch nicht beendet. Macht Perl da etwas anderst wie C? Oder liegt das vlt. an Windows? Ich kenne es bisher nur aus Linux.

Des weiteren hab ich mir die Prozesse mit dem Sysinternals process explorer angeschaut. Der Kindprozess wird da komischer weise garnicht aufgelistet!?

Danke, Denis
sid burn
 2006-10-27 11:07
#71205 #71205
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
Ich kenne es auch nur unter Linux, wie es genau unter Windows läuft weiß ich nicht. Allerdings gibt es auch kein richtiges fork() unter Windows. Wenn du dort fork() benutzt, dann wird ein neuer Thread erstellt, und nicht einfach nur der Prozess geclont.

Das sollte wohl auch der Grund sein warum du ihn nicht im Process Browser siehst.

Das keine positive PID zurück gegeben wird, hat wohl eher mit der Thread geschichte zu tun.

Ansonsten wenn du kill benutzt musst du zuerst das Signal angeben das du verwenden möchtest, und dann die PIDs.

Ansonsten muss man aber auch hier sagen das Windows wohl die meisten Signale nicht kennt. Bzw. soweit ich weiß existieren unter Windows gar keine Signale, und Windows scheint da irgendein eigenes System zu nutzen.

Manche Signale wurden Portiert, aber der größte Teil sollte wahrscheinlich nicht Funktionieren.

Ich denke da kann dir aber jemand anderes der Perl hauptsächlich unter Windows einsetzt mehr zu erzählen. Eigentlich müsste unter "perldoc perlwin32" auch etwas dazu stehen.

EDIT:
Informationen zu fork() unter Windows bekommst du unter "perldoc perlfork"\n\n

<!--EDIT|sid burn|1161933171-->
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
HuberDe
 2006-10-27 12:28
#71206 #71206
User since
2006-10-26
15 Artikel
BenutzerIn
[default_avatar]
Ja ok, ich hab jetzt versucht der PID die ich bekomme ein SIGINT zu schicken. Da beendet sich dann aber der komplette Thread. Auch der Parent, sofern man das überhaupt noch so ansehen kann.
J-jayz-Z
 2006-10-27 13:03
#71207 #71207
User since
2005-04-13
625 Artikel
BenutzerIn
[Homepage] [default_avatar]
[quote=sid burn,27.10.2006, 09:07]Ansonsten muss man aber auch hier sagen das Windows wohl die meisten Signale nicht kennt. Bzw. soweit ich weiß existieren unter Windows gar keine Signale, und Windows scheint da irgendein eigenes System zu nutzen.[/quote]
Das stimmt nicht, Windows nutzt für jeden ****** irgendwelche Signale. Nur eben die Standardsignale sind sehr sehr schlecht implementiert. Es gibt zwar jedes Signal, nur sind das zum großteil nur Dummies, die der portierbarkeit halber existieren.

Wenn du ein Prozess direkt killen willst, musst du dich mit ziemlich häßlicher Windowstheorie beschäftigen. Wie schon erwähnt - Windows erzeugt keinen Clone des aktuellen Prozesses sondern eben einen neuen. Somit hast du aus dem Ursprungsscript nicht die Berechtigung diesen zu killen.
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="5065726c2d436f6d6d756e697479"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'

http://perl-tutor.de
HuberDe
 2006-10-27 13:24
#71208 #71208
User since
2006-10-26
15 Artikel
BenutzerIn
[default_avatar]
Dann sag mir bitte ein Stichwort wie ich das anstellen kann. Was in Linux dermaßen leicht ist, kann ja in Windows nicht mega kompliziert sein!?

edit: Vlt. fahr ich auch besser, wenn ich direkt nen richtigen Thread aufmache!?\n\n

<!--EDIT|HuberDe|1161941423-->
J-jayz-Z
 2006-10-27 13:29
#71209 #71209
User since
2005-04-13
625 Artikel
BenutzerIn
[Homepage] [default_avatar]
Na ja, vielleicht hilft dir Proc::Background
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="5065726c2d436f6d6d756e697479"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'

http://perl-tutor.de
esskar
 2006-10-27 14:18
#71210 #71210
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
unter windows wird ein fork mit threads emuliert. sobald du forkst erhöht sich der thread count der perl.exe um eins.
deswegen bekommst du auch eine negative pid.
aber eigentlich sollte das mit kill funzen
aber nicht so wie du das denkst, sondern
Code: (dl )
kill 1, $pid;


das erste argument von kill ist nämlich das signal!
esskar
 2006-10-27 14:43
#71211 #71211
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
[quote=J-jayz-Z,27.10.2006, 11:03]Das stimmt nicht, Windows nutzt für jeden ****** irgendwelche Signale. Nur eben die Standardsignale sind sehr sehr schlecht implementiert. Es gibt zwar jedes Signal, nur sind das zum großteil nur Dummies, die der portierbarkeit halber existieren.[/quote]
nein; windows hat alle signale; sie sind nur nicht richtig in perl integriert.

Quote
Wenn du ein Prozess direkt killen willst, musst du dich mit ziemlich häßlicher Windowstheorie beschäftigen.


nö, siehe mein beitrag davor.

Quote
Wie schon erwähnt - Windows erzeugt keinen Clone des aktuellen Prozesses sondern eben einen neuen.


quatsch. es ist ein thread; kein eigener prozess.

Quote
Somit hast du aus dem Ursprungsscript nicht die Berechtigung diesen zu killen.


auch quatsch, ich kann jeden prozess aus einen anderen prozess killen, der mindestens von gleichen user gestartet wurde.
betterworld
 2006-10-27 17:36
#71212 #71212
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
[quote=HuberDe,27.10.2006, 08:44]bei einem fork() in Perl bekomme ich eine negative Pid zurück? So wie ich das aus meinem Perl Buch entnehmen kann gehört diese aber zu einer Prozessgruppe, nicht zum Prozess selber? Wenn ich mir beim fork die rückgabe des forks in eine variable schreibe und dann sage "kill $variable" wird der Prozess auch nicht beendet.[/quote]
Unter Unix werden tatsaechlich negative PIDs ab und zu fuer Prozessgruppen benutzt. Zum Beispiel bei kill, denn wenn man da als PID (wie esskar schon sagt: das ist das zweite Argument, nicht das erste) die -1234 angibt, wird die Prozessgruppe 1234 gekillt (nicht -1234, denn die gibt es auch nicht). Das Vorzeichen fungiert also als eine Art Switch. Bei fork steht die PID hingegen im Rueckgabewert, und es wuerde da auch gar keinen Sinn machen, wenn es eine Prozessgruppe bezeichnen wuerde.

Aber unter Windows scheint das ja alles anders zu sein.\n\n

<!--EDIT|betterworld|1161956251-->
esskar
 2006-10-27 18:22
#71213 #71213
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
[quote=betterworld,27.10.2006, 15:36]Aber unter Windows scheint das ja alles anders zu sein.[/quote]
ja, es ist aber transparent.
ob die pid jetzt negativ oder positiv ist ja erstmal egal.
perl's kill unter windows unterscheidet damit nur, ob es einen thread oder einen wirklichen prozess zu killen hat. der absolute wert der negativen pis ist nämlich genau die thread id, oder auch tid genannt!
<< |< 1 2 >| >> 14 Einträge, 2 Seiten



View all threads created 2006-10-27 10:44.