私はPerlで非常に単純なサーバのように動作するプログラムを作ろうとしています。Perlデーモンがループ全体を通過しない
プログラム自体は、図書館のカタログとして機能し、タイトルや著者別に書籍を検索したり、書籍を借りたり返ったりするオプションをユーザに提供します。書籍のリストは別ファイルで提供されています。
基本的には、「リクエスト」フォルダからリクエスト(ファイル)を取り出して処理し、「アンサー」フォルダに回答(ファイル)を与えることになっています。プロセスが終了すると、古いリクエストが削除され、プロセスが繰り返されます(回答は受け入れられた後にクライアントによって削除されます)。
デーモンとして実行することを意図していますが、何らかの理由でリクエストファイルの削除を担当するループだけがバックグラウンドで動作します。リクエストは回答に処理されず、ただ削除されます。新しいリクエストが表示されるたびに、すぐに削除されます。
私はデーモンを使用することを学んでいて、this threadにあるものをエミュレートしようとしました。
#!/usr/bin/perl
use warnings;
use strict;
use Proc::Daemon;
#FUNCTIONS DEFINTIONS
sub FindAuthor
{
#try to find book by this author in the catalogue
}
sub FindTitle
{
#try to find book with this title in the catalogue
}
sub CheckIfCanBeReturned
{
#check if the book is borrowed and by whom
}
#attempt at daemonization
Proc::Daemon::Init;
my $continueWork = 1;
$SIG{TERM} = sub { $continueWork = 0 };
while ($continueWork)
{
sleep(2);
my @RequestFilesArray = `ls /home/Ex5/Requests`;
#list all requests currently in the Request folder
for (my $b = 0; $b < @RequestFilesArray; $b++)
{
my $cut = `printf "$RequestFilesArray[$b]" | wc -m`;
$cut = $cut - 1;
$RequestFilesArray[$b] = substr $RequestFilesArray[$b], 0, $cut;
}
#the requests are formatted in such way,
#that the first 2 letters indicate what the client wants to be done
#and the rest is taken parameters used in the processing
for (my $i = 0; $i < @RequestFilesArray; $i++)
{
my $UserRequest = `tail -1 Requests/$RequestFilesArray[$i]`;
my $fix = `printf "$UserRequest" | wc -m`;
$fix = $fix - 1;
$UserRequest = substr $UserRequest, 0, $fix;
my $RequestType = substr $UserRequest, 0, 2;
my $RequestedValue = substr $UserRequest, 3;
my $RequestNumber = $i;
if ($RequestType eq "fa")
{
#FIND BY AUTHOR
my @results = FindAuthor ($RequestedValue);
my $filename = "/home/Ex5/Answers/" . $RequestFilesArray[$RequestNumber];
open (my $answerFile, '>', $filename) or die "$!";
for (my $a = 0; $a < @results; $a++)
{
print $answerFile $results[$a],"\n";
}
close $answerFile;
}
elsif ($RequestType eq "ft")
{
#FIND BY TITLE
my @results = FindTitle ($RequestedValue);
my $filename = "/home/Ex5/Answers/" . $RequestFilesArray[$RequestNumber];
open (my $answerFile, '>', $filename) or die "$!";
for (my $a = 0; $a < @results; $a++)
{
print $answerFile $results[$a],"\n";
}
close $answerFile;
}
elsif ($RequestType eq "br")
{
#BOOK RETURN
my $result = CheckIfCanBeReturned ($RequestedValue, $RequestFilesArray[$RequestNumber]);
my $filename = "/home/Ex5/Answers/" . $RequestFilesArray[$RequestNumber];
open (my $answerFile, '>', $filename) or die "$!";
print $answerFile $result;
close $answerFile;
}
elsif ($RequestType eq "bb")
{
#BOOK BORROW
my $result = CheckIfCanBeBorrowed ($RequestedValue, $RequestFilesArray[$RequestNumber]);
my $filename = "/home/Ex5/Answers/" . $RequestFilesArray[$RequestNumber];
open (my $answerFile, '>', $filename) or die "$!";
print $answerFile $result;
close $answerFile;
}
else
{
print "something went wrong with this request";
}
}
#deleting processed requests
for (my $e = 0; $e < @RequestFilesArray; $e++)
{
my $removeReq = "/home/Ex5/Requests/" . $RequestFilesArray[$e];
unlink $removeReq;
}
#$continueWork =0;
}
問題の最小限で実行可能なデモンストレーションを提供してください。 – ikegami
'/ dev/null'にエラーを送信すると、デバッグがかなり難しくなります。あなたはそれを修正することから始めるべきです! – ikegami
デバッグ用の 'print'文を追加して、変数の値がわかるようにしてください。 – Barmar