Schrift
[thread]6968[/thread]

[fork] Child aus Parent killen...: wie geht das?

Leser: 1


<< >> 6 Einträge, 1 Seite
zipster
 2005-05-06 18:54
#54649 #54649
User since
2004-09-06
458 Artikel
BenutzerIn
[default_avatar]
Hi,

Ich würde gern in meinem Script mein Child bei einem bestimmten Event aus dem Parent heraus killen, aber wie mach ich das?

Für Hilfe wäre ich sehr dankbar den Google konnte mir nicht weiterhelfen...

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
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
122
123
124
125
126
127
128
129
use File::Spec;
use IO::Socket;
use IO::Select;
use Win32::API;
use Win32;
use Win32::Daemon;
use strict;
use warnings;
my $programmpfad = $0;
$programmpfad =~ s/[^\\]*?$//;
use Win32::Daemon::Simple
Service => 'Go Back!Up',
Name => 'Go Back!Up Service',
Version => 'RC2.0',
Info => {
display => 'Go Back!Up Service',
description => 'Backup Programm',
user => '',
pwd => '',
interactive => '1',
},
Params => {
Tick => 0,
Talkative => 0,
Interval => 1,
LogFile => "$programmpfad\\log\\GoBackUp.log",
Description => <<'*END*',m
*END*
},
param_modify => {
LogFile => sub {File::Spec->rel2abs($_[0])},
tAlkative => sub {undef},
};

LogNT("Running as ".SERVICEID);
ServiceLoop(\&doSomething);
Log("Going down");
exit;
sub doSomething
{
my $pid = fork();
if($pid == 0)
{
my $server = IO::Socket::INET->new(
LocalPort => 2005,
type => SOCK_STREAM,
Reuse => 1,
Listen => 10
) or die "Server läuft nicht: $@\n";
my $select = IO::Select->new($server);
while(my @readable = $select->can_read)
{
foreach my $socket (@readable)
{
if($socket == $server)
{
my $client = $socket->accept;
print "New client connects\n";
$select->add($client);
$client->print("Welcome\n");
}
else
{
my $computername = $socket->getline;
$computername =~ s!\r?\n$!!g; # Zeilenumbruch entfernen
if (defined $computername)
{
chomp $computername;
my $WindowAvailable ="";
$WindowAvailable = FindWindow("$computername");
print "$WindowAvailable\n";
if ($WindowAvailable == 0)
{
#$client->print ("Window ist nicht vorhanden\n");

system "start \"$computername\" cmd.exe";
$socket->print("reconnect\n");
$socket->print("port=12346\n");
#delete_socket($select, $socket);
}
else
{
$socket->print ("Window ist vorhanden\n");
$socket->print("process still running\n");
$socket->print("port=2005\n");
}
}
else
{
print "Client says: [$computername]\n";
delete_socket($select, $socket);
}
}
}


sub FindWindow
{
my $WindowName = shift(@_);
chomp $WindowName;
print "$WindowName";
my $FindWindow = new Win32::API('user32', 'FindWindow', ['P','P'], 'N');# or die print "$!";
my $name = 'Telnet 127.0.0.1';
my $class = 0;
my $topHwnd = $FindWindow->Call($class, $WindowName);
print "$topHwnd\n";
return $topHwnd;
}

sub delete_socket
{
my ($sel, $sock) = @_;
$sel->remove($sock);
$sock->close;
}
}
}
else
{
if (Win32::Daemon::State() == SERVICE_STOP_PENDING)
{
kill(0);
CORE::exit;
Win32::Daemon::State(SERVICE_STOPPED);
Win32::Daemon::StopService();
exit 0;
}
}
}


@Lichtkind
Mit deinem Editor macht Code Posten richtig Spaß.
"Bearbeiten->Konvertieren->Tabs zu Leerzeichen"
;)\n\n

<!--EDIT|zipster|1115391591-->
coax
 2005-05-06 20:31
#54650 #54650
User since
2003-08-11
457 Artikel
BenutzerIn
[default_avatar]
Kinder toeten kannst du mit kill, den entsprechenden Signal und einer Liste der PIDs.
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 strict;
 use warnings;

 use POSIX qw(:signal_h);   # Import der Signal-Konstanten

 $SIG{'CHLD'} = 'IGNORE';      # vermeidet Zombie-Prozesse

 my $pid = fork;

 if($pid == 0) {
     # Kind schlaeft 5 Minuten
     sleep 300;
     exit(0);
 } else {
     # Vater toetet Kind schon nach 10 Sekunden
     # und beendet sich nach 10 Sek selbst
     sleep 10;
     kill SIGKILL, $pid;
     sleep 10;
     exit(0);
 }


Wenn du den Status mit dem der Kindprozess beendet wird abfragen moechtest, musst du dir einen Signalhandler fuer SIGCHLD schreiben (REAPER) und die toten Kinder von Hand aufraeumen (siehe perldoc perlipc Abschnitt Signals).
Im obigen Beispiel wird der Signalhandler fuer SIGCHLD auf 'IGNORE' gesetzt, damit wird gesagt dass man nicht an den Rueckgabe-/Statuswerten der Kinder interessiert ist und die Kinder werden automatisch aufgeraeumt.

edit: Typos\n\n

<!--EDIT|coax|1115397311-->
,,Das perlt aber heute wieder...'' -- Dittsche
GwenDragon
 2005-05-06 21:10
#54651 #54651
User since
2005-01-17
14554 Artikel
Admin1
[Homepage]
user image
Quote
Kinder toeten kannst du mit kill

Kind schläft 5 Minuten ...

# Vater tötet Kind nach schon 10 Sekunden
# und beendet sich nach 10 Sek selbst

und die toten Kinder von Hand aufraeumen

Der Stil ist B*ld-Zeitungsreif!
Wenn alle ProgrammiererInnen so schreiben würden.
Bin ich noch im richtigen Forum?
die Drachin, Gwendolyn


Unterschiedliche Perl-Versionen auf Windows (fast wie perlbrew) • Meine Perl-Artikel

coax
 2005-05-06 23:09
#54652 #54652
User since
2003-08-11
457 Artikel
BenutzerIn
[default_avatar]
[quote=GwenDragon,06.05.2005, 19:10]Der Stil ist B*ld-Zeitungsreif!
Wenn alle ProgrammiererInnen so schreiben würden.
[/quote]
Wenn es sich hier um menschliche Wesen handeln wuerde, wuerde ich sagen, dann ist es makaber, hier tut es sich aber um Prozesse drehen.
Ich war eben etwas tippfaul, das ist ja immerhin noch mir ueberlassen. :p
Quote
Bin ich noch im richtigen Forum?

Das frag ich mich des oefteren auch.
,,Das perlt aber heute wieder...'' -- Dittsche
GwenDragon
 2005-05-06 23:35
#54653 #54653
User since
2005-01-17
14554 Artikel
Admin1
[Homepage]
user image
[quote=coax,06.05.2005, 21:09][quote=GwenDragon,06.05.2005, 19:10]Der Stil ist B*ld-Zeitungsreif!
Wenn alle ProgrammiererInnen so schreiben würden.
[/quote]
Wenn es sich hier um menschliche Wesen handeln wuerde, wuerde ich sagen, dann ist es makaber, hier tut es sich aber um Prozesse drehen.
Ich war eben etwas tippfaul, das ist ja immerhin noch mir ueberlassen. :p
Quote
Bin ich noch im richtigen Forum?

Das frag ich mich des oefteren auch.[/quote]
na mir ist schon klar dass es sich um child processes handelt. Und nicht um Kinder.

<IRO>Zum Glück darf eineR hier ja noch ohne Gewissensbisse childs töten ohne in einen Prozess zu geraten. Nee, um aus einen Prozess zu kommen.</IRO>

Richtiges Forum? Ja.
die Drachin, Gwendolyn


Unterschiedliche Perl-Versionen auf Windows (fast wie perlbrew) • Meine Perl-Artikel

zipster
 2005-05-09 11:49
#54654 #54654
User since
2004-09-06
458 Artikel
BenutzerIn
[default_avatar]
Also hat Super funktioniert. DANKE!
<< >> 6 Einträge, 1 Seite



View all threads created 2005-05-06 18:54.