linux下perl上的基本聊天系统

我试着写一些基本的聊天系统只是为了学习perl.我试图将聊天记录变成1个文件并打印新消息,如果它出现在chatlog.dat文件中,所以我写了一个功能几乎完全相同的东西,但我有一些问题,不知道如何解决它们.
所以现在我有2个问题!

>我无法理解如何使checkFile函数始终处于活动状态(如multiprocession)以持续检查新消息
>当我尝试编写将附加到聊天记录中的新消息时,会出现此问题.解释器在我的$newMessage =< STDIN>;行等待我输入,但是,如果有人写了新消息怎么办?直到他按下进入才会显示…如何取消?

my ($sec,$min,$hour) = localtime();
while(1){
    my $userMessage = <STDIN>;
    last if $userMessage eq "::quit";
    `echo "($hour:$min:$sec): $userMessage" >>chatlog.dat`;
}

sub checkFile{
    my $lastMessage = "";
    my $newMessage = "";
    while (1) {
        my $context = `cat chatlog.dat`;
        split(/\n/,$context);
        $newMessage = $_[$#_];
        if ($newMessage ne $lastMessage) {
            print $newMessage;
            $lastMessage = $newMessage;
        }
    }
}

解决方法

第一:

>不要在perl脚本中使用echo.当你有完美的IO例程时,它很难逃脱.
>使用cat来读取文件与使用’echo’一样令人讨厌.
>阅读< STDIN>这将是一个阻塞调用 – 这意味着你的脚本将暂停.
>但这并不像它听起来那么糟糕,因为否则你正在运行一个“忙等待”循环,它会重复捕捉文件.这是一个非常糟糕的主意.
>你假设写一个像原子操作的文件,当它不是时.你也会遇到这样的问题.

我建议你看看IO :: Handle,并考虑使用flock来确保你已经为IO锁定了文件.您可能还希望考虑File :: Tail.

我实际上建议,你想考虑一种不同的IPC模式 – 因为’文件交换’是非常低效的.如果您真的想要为IO使用文件系统,您可能需要考虑使用FIFO管道 – 让每个“客户端”打开它自己的,并让服务器读取并合并它们.

无论哪种方式 – 您需要使用IO :: Select或者多线程,只需在读写之间来回切换. http://perldoc.perl.org/IO/Select.html

相关文章

linux常用进程通信方式包括管道(pipe)、有名管道(FIFO)、...
Linux性能观测工具按类别可分为系统级别和进程级别,系统级别...
本文详细介绍了curl命令基础和高级用法,包括跳过https的证书...
本文包含作者工作中常用到的一些命令,用于诊断网络、磁盘占满...
linux的平均负载表示运行态和就绪态及不可中断状态(正在io)的...
CPU上下文频繁切换会导致系统性能下降,切换分为进程切换、线...