راهنمایی در مورد یک کد Perl
با سلام،
من سعی دارم کدی بنویسم که برنامه خاصی را در Dos اجرا کنه (یا همون CMD در ویندوز). ولی با توجه به این که اون برنامه گاهی اوقات هنگ می کنه، کد من لازمه که Timeout داشته باشه و بعد از فرا رسیدن Timeout برنامه ی Dos را kill کنه. پس از جستجو در سایت های انگلیسی، توانستم این کد رو برای قابلیت Timeout سرهم کنم که کار هم می کنه ولی این کد هنوز برنامه Dos رو kill نمی کنه:
کد:
my ($XfoilLocation, $ResultsDirectory, $basename, $timeout) = @ARGV;
my $stringA = $XfoilLocation . ' <' . $ResultsDirectory . '\\' . $basename . '.xfoil >nul';
eval {
local $SIG{ALRM} = sub { die "alarm\n" }; # NB: \n required
alarm $timeout;
system($stringA);
alarm 0;
};
if ($@) {
die unless $@ eq "alarm\n"; # propagate unexpected errors
# timed out
}
else {
# didn't
}
با جستجوی بیشتر متوجه شدم که باید از قابلیت fork استفاده کنم تا همزمان با اجرای برنامه Dos، بتونم PID برنامه اجرا شده رو ذخیره کنم و بعد با استفاده از این PID، برنامه DOS رو kill کنم. برای پیدا کردن PID برنامه اجرا شده این قطعه کد رو پیدا کردم:
کد:
my $cpid; # Run Xfoil and get the PID of this instance of Xfoil
{
defined($cpid = fork) or die $!;
$cpid and last;
exec($stringA);
}
echo $cpid
ولی نمی دونم چه طور باید این قطعه کد رو در کد اصلی قرار بدهم. چون کپی پیست تنها جواب نداد:
کد:
my ($XfoilLocation, $ResultsDirectory, $basename, $timeout) = @ARGV;
my $stringA = $XfoilLocation . ' <' . $ResultsDirectory . '\\' . $basename . '.xfoil >nul';
eval {
local $SIG{ALRM} = sub { die "alarm\n" }; # NB: \n required
alarm $timeout;
my $cpid; # Run Xfoil and get the PID of this instance of Xfoil
{
defined($cpid = fork) or die $!;
$cpid and last;
exec($stringA);
}
echo $cpid
alarm 0;
};
if ($@) {
die unless $@ eq "alarm\n"; # propagate unexpected errors
# timed out
# Xfoil has crashed. Kill this instance of Xfoil via its PID
my $stringC = 'taskkill /f /pid ' . $cpid;
system($stringC);
}
else {
# didn't
}
من اصلا آشنایی با Perl ندارم و به دلیل کمبود وقت، نمی تونم این زبان رو یاد بگیرم، استفاده ای هم برای من نداره. من کل برنامه نویسی ای که انجام داده ام با Matlab هست و فقط همین یک کدی را که توضیح دادم از Perl لازم دارم. (چون قابلیت Timeout و kill در Matlab نیست). پس اگر لطف کنید کد من رو ویرایش کنید و کد نهایی رو به من بدهید بسیار ممنون خواهم شد.