edit: problem solved. Fork using system() to run an external process was leaving me with double copies (and double again, etc) of my script running. One good suggestion was to use exec() instead of system(). I fixed it on my own in the meantime by placing and "exit" immediately after system() in the child process.
I also pasted the wrong source here... Source from before the fork was added. Finished source code added to the bottom of this message.
My first "professional" perl script... And it just isn't working right.
Once per minute, ping partner.
If ping succeeds and didn't previously succeed, change .ini file to "oneline", kill running process and restart it.
If ping doesn't succeed, and previously succeeded, change .ini file to "allmachines", kill running process and restart it.
Actual operation: I am seeing the .ini being changed to what it already is (should not be possible). Worse yet, after a period of several minutes the pings started coming more frequently that once per minute. My Win2K laptop quit responding to commands, and I had to yank the battery to reboot. Attached are the code and the log file that shows the misbehavior.
#!perl.exe -w
use strict;
use Net::Ping;
use Win32::PerfLib;
use Win32::Process;
my $status = 2;
while ($status < 3) {
&ping;
sleep (60);
}
sub ping {
print "ping";
my $time;
my $ping = Net::Ping->new("icmp");
open(INPUT, "< ip-address.txt") or die "could not open address fil
+e";
my @ip = <INPUT>;
close(INPUT);
open(OUTPUT, ">> output.txt") or die "could not open output file";
foreach my $host (@ip){
unless ($host =~ "^#") {
chop $host;
$time = localtime();
if ($host ne "" && $host ne "\n"){
if ($ping->ping($host)) {
print OUTPUT "$time /// $host is alive\n";
if ($status != 0) {
$status = 0;
&subone;
}
}
else {
print OUTPUT "$time /// $host is dead\n";
if ($status != 1) {
$status = 1;
&suball;
}
}
}
else {print OUTPUT "$time /// No Ip Entered\n";}
}
}
$ping->close();
close(OUTPUT);
}
sub killmware {
print "killmware";
my $server = "";
my %rtasks;
my %counter;
Win32::PerfLib::GetCounterNames($server, \%counter);
my %r_counter = map { $counter{$_} => $_ } keys %counter;
# retrieve the id for process object
my $process_obj = $r_counter{Process};
# retrieve the id for the process ID counter
my $process_id = $r_counter{'ID Process'};
# create connection to $server
my $perflib = new Win32::PerfLib($server);
my $proc_ref = {};
# get the performance data for the process object
$perflib->GetObjectList($process_obj, $proc_ref);
$perflib->Close();
my $instance_ref = $proc_ref->{Objects}->{$process_obj}->{Instance
+s};
foreach my $p (sort keys %{$instance_ref}) {
my $counter_ref = $instance_ref->{$p}->{Counters};
foreach my $i (keys %{$counter_ref}) {
if($counter_ref->{$i}->{CounterNameTitleIndex} ==
+$process_id) {
$rtasks{$counter_ref->{$i}->{Counter}} = $inst
+ance_ref->{$p}->{Name};
}
}
}
while ( (my $key, my $value) = each %rtasks ) {
if ($value eq "maincnc") {Win32::Process::KillProcess($key,
+0)}
}
}
sub startup {
system ('maincnc.exe');
print "startup";
}
sub suball {
print "suball";
open (ALL, '< all_machines.ini') or die "ERROR! all_machines.ini m
+issing!";
open (MAIN, '> maincnc.ini') or die "ERROR! Could not write to mai
+ncnc.ini";
while (<ALL>){ print MAIN $_ }
close MAIN;
close ALL;
&killmware;
&startup;
}
sub subone {
print "subone";
open (ALL, '< oneline.ini') or die "ERROR! oneline.ini missing!";
open (MAIN, '> maincnc.ini') or die "ERROR! Could not write to mai
+ncnc.ini";
while (<ALL>){ print MAIN $_ }
close MAIN;
close ALL;
&killmware;
&startup;
}
Tue Aug 17 15:11:49 2004 /// 53.236.33.28 is alive
Switching maincnc.ini to oneline.ini
Tue Aug 17 15:12:49 2004 /// 53.236.33.28 is alive
Tue Aug 17 15:13:50 2004 /// 53.236.33.28 is alive
Tue Aug 17 15:14:50 2004 /// 53.236.33.28 is alive
Tue Aug 17 15:15:50 2004 /// 53.236.33.28 is alive
Tue Aug 17 15:16:50 2004 /// 53.236.33.28 is alive
Tue Aug 17 15:17:50 2004 /// 53.236.49.40 is dead
Switching maincnc.ini to allmachines.ini
Tue Aug 17 15:18:57 2004 /// 53.236.49.40 is dead
Tue Aug 17 15:18:56 2004 /// 53.236.49.40 is dead
Switching maincnc.ini to allmachines.ini
Tue Aug 17 15:20:02 2004 /// 53.236.49.40 is dead
Tue Aug 17 15:20:02 2004 /// 53.236.49.40 is dead
Tue Aug 17 15:20:02 2004 /// 53.236.49.40 is dead
Tue Aug 17 15:22:57 2004 /// 53.236.49.40 is dead
Switching maincnc.ini to allmachines.ini
Tue Aug 17 15:24:03 2004 /// 53.236.49.40 is dead
Tue Aug 17 15:25:08 2004 /// 53.236.49.40 is dead
Tue Aug 17 15:26:13 2004 /// 53.236.49.40 is dead
Tue Aug 17 15:27:18 2004 /// 53.236.49.40 is dead
Tue Aug 17 15:28:23 2004 /// 53.236.49.40 is dead
Tue Aug 17 15:29:28 2004 /// 53.236.49.40 is dead
Tue Aug 17 15:30:33 2004 /// 53.236.49.40 is dead
Tue Aug 17 15:31:38 2004 /// 53.236.49.40 is dead
Tue Aug 17 15:32:43 2004 /// 53.236.49.40 is dead
Tue Aug 17 15:33:48 2004 /// 53.236.33.28 is alive
Switching maincnc.ini to oneline.ini
Tue Aug 17 15:34:49 2004 /// 53.236.33.28 is alive
Tue Aug 17 15:34:49 2004 /// 53.236.33.28 is alive
Switching maincnc.ini to oneline.ini
Tue Aug 17 15:35:49 2004 /// 53.236.33.28 is alive
Tue Aug 17 15:35:49 2004 /// 53.236.33.28 is alive
Tue Aug 17 15:35:50 2004 /// 53.236.33.28 is alive
Tue Aug 17 15:36:49 2004 /// 53.236.33.28 is alive
Tue Aug 17 15:36:49 2004 /// 53.236.33.28 is alive
Tue Aug 17 15:36:50 2004 /// 53.236.33.28 is alive
Tue Aug 17 15:37:49 2004 /// 53.236.33.28 is alive
Tue Aug 17 15:37:49 2004 /// 53.236.33.28 is alive
Tue Aug 17 15:37:50 2004 /// 53.236.33.28 is alive
Tue Aug 17 15:38:49 2004 /// 53.236.49.41 is dead
Switching maincnc.ini to allmachines.ini
Tue Aug 17 15:38:49 2004 /// 53.236.49.41 is dead
Switching maincnc.ini to allmachines.ini
Tue Aug 17 15:38:50 2004 /// 53.236.49.41 is dead
Switching maincnc.ini to allmachines.ini
Tue Aug 17 15:39:55 2004 /// 53.236.49.41 is dead
Tue Aug 17 15:39:54 2004 /// 53.236.49.41 is dead
Switching maincnc.ini to allmachines.ini
Tue Aug 17 15:39:56 2004 /// 53.236.49.41 is dead
Tue Aug 17 15:40:05 2004 /// 53.236.49.41 is dead
Tue Aug 17 15:40:05 2004 /// 53.236.49.41 is dead
Tue Aug 17 15:40:06 2004 /// 53.236.49.41 is dead
Tue Aug 17 15:41:00 2004 /// 53.236.49.41 is dead
Tue Aug 17 15:41:00 2004 /// 53.236.49.41 is dead
Tue Aug 17 15:41:01 2004 /// 53.236.49.41 is dead
Tue Aug 17 15:41:01 2004 /// 53.236.49.41 is dead
Tue Aug 17 15:41:10 2004 /// 53.236.49.41 is dead
Tue Aug 17 15:41:10 2004 /// 53.236.49.41 is dead
Tue Aug 17 15:41:11 2004 /// 53.236.49.41 is dead
Tue Aug 17 15:42:05 2004 /// 53.236.49.41 is dead
Tue Aug 17 15:42:05 2004 /// 53.236.49.41 is dead
Tue Aug 17 15:42:06 2004 /// 53.236.49.41 is dead
Tue Aug 17 15:42:06 2004 /// 53.236.49.41 is dead
Tue Aug 17 15:42:15 2004 /// 53.236.49.41 is dead
Tue Aug 17 15:42:15 2004 /// 53.236.49.41 is dead
Tue Aug 17 15:42:16 2004 /// 53.236.49.41 is dead
Tue Aug 17 15:43:10 2004 /// 53.236.33.30 is alive
Switching maincnc.ini to oneline.ini
Tue Aug 17 15:43:10 2004 /// 53.236.33.30 is alive
Switching maincnc.ini to oneline.ini
Tue Aug 17 15:43:12 2004 /// 53.236.33.30 is alive
Switching maincnc.ini to oneline.ini
Tue Aug 17 15:43:11 2004 /// 53.236.33.30 is alive
Switching maincnc.ini to oneline.ini
Tue Aug 17 15:43:20 2004 /// 53.236.33.30 is alive
Switching maincnc.ini to oneline.ini
Tue Aug 17 15:43:20 2004 /// 53.236.33.30 is alive
Switching maincnc.ini to oneline.ini
Tue Aug 17 15:43:21 2004 /// 53.236.33.30 is alive
Switching maincnc.ini to oneline.ini
Tue Aug 17 15:44:10 2004 /// 53.236.33.30 is alive
Tue Aug 17 15:44:10 2004 /// 53.236.33.30 is alive
Switching maincnc.ini to oneline.ini
Tue Aug 17 15:44:19 2004 /// 53.236.33.30 is alive
Tue Aug 17 15:44:20 2004 /// 53.236.33.30 is alive
Tue Aug 17 15:44:24 2004 /// 53.236.33.30 is alive
Tue Aug 17 15:44:24 2004 /// 53.236.33.30 is alive
Tue Aug 17 15:44:32 2004 /// 53.236.33.30 is alive
Tue Aug 17 15:44:38 2004 /// 53.236.33.30 is alive
Tue Aug 17 15:44:38 2004 /// 53.236.33.30 is alive
Tue Aug 17 15:44:38 2004 /// 53.236.33.30 is alive
Tue Aug 17 15:44:38 2004 /// 53.236.33.30 is alive
Tue Aug 17 15:44:39 2004 /// 53.236.33.30 is alive
Tue Aug 17 15:44:50 2004 /// 53.236.33.30 is alive
Tue Aug 17 15:44:52 2004 /// 53.236.33.30 is alive
Tue Aug 17 15:45:10 2004 /// 53.236.33.30 is alive
Tue Aug 17 15:45:11 2004 /// 53.236.33.30 is alive
Tue Aug 17 15:45:11 2004 /// 53.236.33.30 is alive
Tue Aug 17 15:45:20 2004 /// 53.236.33.30 is alive
Tue Aug 17 15:45:20 2004 /// 53.236.33.30 is alive
Tue Aug 17 15:45:24 2004 /// 53.236.33.30 is alive
Tue Aug 17 15:45:24 2004 /// 53.236.33.30 is alive
Tue Aug 17 15:45:32 2004 /// 53.236.33.30 is alive
Tue Aug 17 15:45:38 2004 /// 53.236.33.30 is alive
Tue Aug 17 15:45:38 2004 /// 53.236.33.30 is alive
Tue Aug 17 15:45:38 2004 /// 53.236.33.30 is alive
Tue Aug 17 15:45:38 2004 /// 53.236.33.30 is alive
Tue Aug 17 15:45:39 2004 /// 53.236.33.30 is alive
Tue Aug 17 15:45:50 2004 /// 53.236.33.30 is alive
Tue Aug 17 15:45:52 2004 /// 53.236.33.30 is alive
Tue Aug 17 15:46:10 2004 /// 53.236.33.30 is alive
Tue Aug 17 15:46:11 2004 /// 53.236.33.30 is alive
Tue Aug 17 15:46:11 2004 /// 53.236.33.30 is alive
Tue Aug 17 15:46:20 2004 /// 53.236.33.30 is alive
Tue Aug 17 15:46:20 2004 /// 53.236.33.30 is alive
Tue Aug 17 15:46:24 2004 /// 53.236.33.30 is alive
Tue Aug 17 15:46:24 2004 /// 53.236.33.30 is alive
Tue Aug 17 15:46:32 2004 /// 53.236.33.30 is alive
Tue Aug 17 15:46:38 2004 /// 53.236.33.30 is alive
Tue Aug 17 15:46:38 2004 /// 53.236.33.30 is alive
Tue Aug 17 15:46:38 2004 /// 53.236.33.30 is alive
Tue Aug 17 15:46:38 2004 /// 53.236.33.30 is alive
Tue Aug 17 15:46:39 2004 /// 53.236.33.30 is alive
Tue Aug 17 15:46:50 2004 /// 53.236.33.30 is alive
Tue Aug 17 15:46:52 2004 /// 53.236.33.30 is alive
Tue Aug 17 15:47:10 2004 /// 53.236.33.30 is alive
Tue Aug 17 15:47:11 2004 /// 53.236.33.30 is alive
Tue Aug 17 15:47:11 2004 /// 53.236.33.30 is alive
Tue Aug 17 15:47:20 2004 /// 53.236.33.30 is alive
Tue Aug 17 15:47:20 2004 /// 53.236.33.30 is alive
Tue Aug 17 15:47:24 2004 /// 53.236.33.30 is alive
Tue Aug 17 15:47:24 2004 /// 53.236.33.30 is alive
Tue Aug 17 15:47:33 2004 /// 53.236.33.30 is alive
Tue Aug 17 15:47:38 2004 /// 53.236.33.30 is alive
Tue Aug 17 15:47:39 2004 /// 53.236.33.30 is alive
Tue Aug 17 15:47:39 2004 /// 53.236.33.30 is alive
Tue Aug 17 15:47:39 2004 /// 53.236.33.30 is alive
Tue Aug 17 15:47:39 2004 /// 53.236.33.30 is alive
Tue Aug 17 15:47:51 2004 /// 53.236.33.30 is alive
Tue Aug 17 15:47:52 2004 /// 53.236.33.30 is alive
Tue Aug 17 15:48:11 2004 /// 53.236.33.30 is alive
Tue Aug 17 15:48:11 2004 /// 53.236.33.30 is alive
Tue Aug 17 15:48:11 2004 /// 53.236.33.30 is alive
Tue Aug 17 15:48:20 2004 /// 53.236.33.30 is alive
Tue Aug 17 15:48:21 2004 /// 53.236.33.30 is alive
Tue Aug 17 15:48:24 2004 /// 53.236.49.40 is dead
Switching maincnc.ini to allmachines.ini
Tue Aug 17 15:48:24 2004 /// 53.236.49.40 is dead
Switching maincnc.ini to allmachines.ini
Tue Aug 17 15:48:33 2004 /// 53.236.49.40 is dead
Switching maincnc.ini to allmachines.ini
Tue Aug 17 15:48:39 2004 /// 53.236.49.40 is dead
Switching maincnc.ini to allmachines.ini
Tue Aug 17 15:48:39 2004 /// 53.236.49.40 is dead
Switching maincnc.ini to allmachines.ini
Tue Aug 17 15:48:39 2004 /// 53.236.49.40 is dead
Switching maincnc.ini to allmachines.ini
Tue Aug 17 15:48:39 2004 /// 53.236.49.40 is dead
Switching maincnc.ini to allmachines.ini
Tue Aug 17 15:48:51 2004 /// 53.236.49.40 is dead
Switching maincnc.ini to allmachines.ini
Tue Aug 17 15:48:39 2004 /// 53.236.49.40 is dead
Switching maincnc.ini to allmachines.ini
Tue Aug 17 15:49:31 2004 /// 53.236.49.40 is dead
Tue Aug 17 15:49:30 2004 /// 53.236.49.40 is dead
Switching maincnc.ini to allmachines.ini
Tue Aug 17 15:49:30 2004 /// 53.236.49.40 is dead
Switching maincnc.ini to allmachines.ini
Tue Aug 17 15:49:30 2004 /// 53.236.49.40 is dead
Switching maincnc.ini to allmachines.ini
Tue Aug 17 15:49:30 2004 /// 53.236.49.40 is dead
Switching maincnc.ini to allmachines.ini
Tue Aug 17 15:49:30 2004 /// 53.236.49.40 is dead
Switching maincnc.ini to allmachines.ini
Tue Aug 17 15:49:37 2004 /// 53.236.49.40 is dead
Tue Aug 17 15:49:37 2004 /// 53.236.49.40 is dead
Tue Aug 17 15:49:30 2004 /// 53.236.49.40 is dead
Switching maincnc.ini to allmachines.ini
Tue Aug 17 15:49:43 2004 /// 53.236.49.40 is dead
Tue Aug 17 15:49:44 2004 /// 53.236.49.40 is dead
Tue Aug 17 15:50:00 2004 /// 53.236.49.40 is dead
Tue Aug 17 15:51:02 2004 /// 53.236.49.40 is dead
Tue Aug 17 15:51:02 2004 /// 53.236.49.40 is dead
Tue Aug 17 15:51:06 2004 /// 53.236.49.40 is dead
Tue Aug 17 15:51:06 2004 /// 53.236.49.40 is dead
Tue Aug 17 15:51:04 2004 /// 53.236.49.40 is dead
Tue Aug 17 15:51:12 2004 /// 53.236.49.40 is dead
Tue Aug 17 15:51:06 2004 /// 53.236.49.40 is dead
Tue Aug 17 15:51:13 2004 /// 53.236.49.40 is dead
Tue Aug 17 15:51:21 2004 /// 53.236.49.40 is dead
Tue Aug 17 15:51:16 2004 /// 53.236.49.40 is dead
Tue Aug 17 15:51:26 2004 /// 53.236.49.40 is dead
Tue Aug 17 15:51:26 2004 /// 53.236.49.40 is dead
Tue Aug 17 15:51:27 2004 /// 53.236.49.40 is dead
Tue Aug 17 15:51:28 2004 /// 53.236.49.40 is dead
Tue Aug 17 15:51:36 2004 /// 53.236.49.40 is dead
Tue Aug 17 15:52:46 2004 /// 53.236.49.40 is dead
Tue Aug 17 15:52:46 2004 /// 53.236.49.40 is dead
Tue Aug 17 15:52:46 2004 /// 53.236.49.40 is dead
Tue Aug 17 15:53:00 2004 /// 53.236.49.40 is dead
Tue Aug 17 15:53:03 2004 /// 53.236.49.40 is dead
Tue Aug 17 15:53:05 2004 /// 53.236.49.40 is dead
Tue Aug 17 15:53:05 2004 /// 53.236.49.40 is dead
Tue Aug 17 15:53:06 2004 /// 53.236.49.40 is dead
Tue Aug 17 15:53:15 2004 /// 53.236.49.40 is dead
Tue Aug 17 15:53:14 2004 /// 53.236.49.40 is dead
Tue Aug 17 15:53:38 2004 /// 53.236.49.40 is dead
Tue Aug 17 15:54:12 2004 /// 53.236.49.40 is dead
Tue Aug 17 15:54:12 2004 /// 53.236.49.40 is dead
Tue Aug 17 15:54:12 2004 /// 53.236.49.40 is dead
Tue Aug 17 15:54:12 2004 /// 53.236.49.40 is dead
Tue Aug 17 15:54:12 2004 /// 53.236.49.40 is dead
Tue Aug 17 15:54:12 2004 /// 53.236.49.40 is dead
Tue Aug 17 15:54:15 2004 /// 53.236.49.40 is dead
Tue Aug 17 15:54:11 2004 /// 53.236.49.40 is dead
Tue Aug 17 15:54:47 2004 /// 53.236.49.40 is dead
Tue Aug 17 15:54:53 2004 /// 53.236.49.40 is dead
Tue Aug 17 15:55:00 2004 /// 53.236.49.40 is dead
Tue Aug 17 15:55:29 2004 /// 53.236.49.40 is dead
Tue Aug 17 15:55:28 2004 /// 53.236.49.40 is dead
Tue Aug 17 15:55:29 2004 /// 53.236.49.40 is dead
Tue Aug 17 15:55:29 2004 /// 53.236.49.40 is dead
Tue Aug 17 15:55:29 2004 /// 53.236.49.40 is dead
Tue Aug 17 15:55:47 2004 /// 53.236.49.40 is dead
Tue Aug 17 15:55:47 2004 /// 53.236.49.40 is dead
Tue Aug 17 15:55:53 2004 /// 53.236.49.40 is dead
Tue Aug 17 15:55:53 2004 /// 53.236.49.40 is dead
Tue Aug 17 15:55:53 2004 /// 53.236.49.40 is dead
Tue Aug 17 15:55:53 2004 /// 53.236.49.40 is dead
Tue Aug 17 15:55:53 2004 /// 53.236.49.40 is dead
Tue Aug 17 15:55:54 2004 /// 53.236.49.40 is dead
Tue Aug 17 15:56:58 2004 /// 53.236.49.40 is dead
Tue Aug 17 15:56:59 2004 /// 53.236.49.40 is dead
Tue Aug 17 15:57:29 2004 /// 53.236.49.40 is dead
Tue Aug 17 15:57:29 2004 /// 53.236.49.40 is dead
Tue Aug 17 15:57:29 2004 /// 53.236.49.40 is dead
Tue Aug 17 15:57:29 2004 /// 53.236.49.40 is dead
Tue Aug 17 15:57:29 2004 /// 53.236.49.40 is dead
Tue Aug 17 15:57:23 2004 /// 53.236.49.40 is dead
Edit: finished product
#!perl.exe -w
use strict;
use Net::Ping;
use Win32::PerfLib;
use Win32::Process;
my $status = 2;
my $command;
$SIG{CHLD} = 'IGNORE';
while ($status < 3) {
&ping;
sleep (60);
}
sub ping {
my $time;
my $ping = Net::Ping->new("icmp");
open(INPUT, "< ip-address.txt") or die "could not open address fil
+e";
my @ip = <INPUT>;
close(INPUT);
open(OUTPUT, ">> output.txt") or die "could not open output file";
foreach my $host (@ip){
unless ($host =~ "^#") {
chop $host;
$time = localtime();
if ($host ne "" && $host ne "\n"){
if ($ping->ping($host)) {
print OUTPUT "$time /// $host is alive\n";
if ($status != 0) {
print OUTPUT "Switching maincnc.ini to oneline
+.ini\n";
$status = 0;
&subone();
}
}
else {
print OUTPUT "$time /// $host is dead\n";
if ($status != 1) {
print OUTPUT "Switching maincnc.ini to allma
+chines.ini\n";
$status = 1;
&suball();
}
}
}
else {print OUTPUT "$time /// No Ip Entered\n";}
}
}
$ping->close();
close(OUTPUT);
}
sub killmware {
my $server = "";
my %rtasks;
my %counter;
Win32::PerfLib::GetCounterNames($server, \%counter);
my %r_counter = map { $counter{$_} => $_ } keys %counter;
# retrieve the id for process object
my $process_obj = $r_counter{Process};
# retrieve the id for the process ID counter
my $process_id = $r_counter{'ID Process'};
# create connection to $server
my $perflib = new Win32::PerfLib($server);
my $proc_ref = {};
# get the performance data for the process object
$perflib->GetObjectList($process_obj, $proc_ref);
$perflib->Close();
my $instance_ref = $proc_ref->{Objects}->{$process_obj}->{Instance
+s};
foreach my $p (sort keys %{$instance_ref}) {
my $counter_ref = $instance_ref->{$p}->{Counters};
foreach my $i (keys %{$counter_ref}) {
if($counter_ref->{$i}->{CounterNameTitleIndex} ==
+$process_id) {
$rtasks{$counter_ref->{$i}->{Counter}} = $inst
+ance_ref->{$p}->{Name};
}
}
}
while ( (my $key, my $value) = each %rtasks ) {
if ($value eq "maincnc") {Win32::Process::KillProcess($key,
+0)}
}
}
sub suball {
open (ALL, '< all_machines.ini') or die "ERROR! all_machines.ini m
+issing!";
open (MAIN, '> maincnc.ini') or die "ERROR! Could not write to mai
+ncnc.ini";
while (<ALL>){ print MAIN $_ }
close MAIN;
close ALL;
&killmware;
defined(my $pid = fork) or die "Cannot fork: $!";
unless ($pid) {
# Child process is here
system ('maincnc.exe');
exit;
}
# Parent process is here
}
sub subone {
open (ALL, '< oneline.ini') or die "ERROR! oneline.ini missing!";
open (MAIN, '> maincnc.ini') or die "ERROR! Could not write to mai
+ncnc.ini";
while (<ALL>){ print MAIN $_ }
close MAIN;
close ALL;
&killmware;
defined(my $pid = fork) or die "Cannot fork: $!";
unless ($pid) {
# Child process is here
system ('maincnc.exe');
exit;
}
# Parent process is here
}
--
Believe nothing, no matter where you read it, or who said it - even if I have said it - unless it agrees with your own reason and your own common sense.
(Buddha)