gpt4 book ai didi

linux - Perl 守护进程不执行整个循环

转载 作者:太空宇宙 更新时间:2023-11-04 04:38:38 32 4
gpt4 key购买 nike

我正在尝试使用 Perl 制作一个像非常简单的服务器一样工作的程序。

该程序本身旨在充当图书馆目录,为用户提供按书名或作者搜索书籍以及借阅或归还书籍的选项。书籍列表在单独的文件中提供。

基本上,它应该从“Requests”文件夹中获取请求(文件),处理它们,然后在“Answers”文件夹中给出答案(也是文件)。该过程结束后,它会删除旧的请求并重复该过程(答案在客户端接受后将被删除)。

它应该作为守护进程运行,但由于某种原因,只有负责删除请求文件的循环在后台工作 - 请求不会被处理成答案,而只是被删除。每当出现新请求时,它几乎会立即被删除。

我正在学习使用守护进程并尝试模拟 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;
}

最佳答案

在尝试测试之前,您已经编写了太多的代码。您还利用一切机会启动 shell 进程,而不是学习在 Perl 中实现目标的正确方法

第一个错误是使用ls来发现哪些作业正在等待。 ls 每行打印多个文件,并且您使用奇怪的 printf "$RequestFilesArray[$b]"| 将每一行的整个内容视为一个文件名。 wc -m 而不是 length $RequestFilesArray[$b]

此后事情只会变得更糟

我建议如下

  • 从头开始

  • 用 Perl 编写程序。 Perl 不是 shell 语言

  • 非常小的增量前进,确保您的代码每三到四行编译一次并执行预期的操作。知道您正在增强工作代码而不是创建神奇的随机字符序列,这确实令人充满信心

  • 了解如何调试。您似乎盯着代码希望从中获得灵感,就像某人盯着汽车发动机希望了解其无法启动的原因一样

  • 删除请求文件作为处理请求的一部分,并且仅在请求已处理且应答文件已成功写入后删除。它不应该在单独的循环中完成

关于linux - Perl 守护进程不执行整个循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44662336/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com