Thread [fork] Child aus Parent killen...: wie geht das? (5 answers)
Opened by zipster at 2005-05-06 18:54

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-->

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