gpt4 book ai didi

perl - 我可以在我的 Perl 程序中使用 POSIX 信号来创建事件驱动编程吗?

转载 作者:行者123 更新时间:2023-12-04 16:41:36 24 4
gpt4 key购买 nike

是否有任何 POSIX 信号可以在我的 Perl 程序中用于创建事件驱动编程?目前,我有能够交叉通信的多进程程序,但我的父线程一次只能听一个 child 听。

foreach (@proc) {
sysread(${$_}{'read'}, my $line, 100); #problem here
chomp($line);
print "Parent hears: $line\n";
}
问题是 parent 处于持续等待状态,直到它收到第一个子进程的信号才能继续。我依靠“管道”进行互通。
我当前的解决方案非常类似于: How can I use `pipe` to facilitate interprocess communication in Perl?
如果可能的话,我想依靠 $SIG{...} 事件或任何非 CPAN 解决方案。
更新:
正如 Jonathan Leffler 提到的,kill 可用于发送信号:
kill USR1 => $$; # send myself a SIGUSR1
我的解决方案是向我的子进程发送一个 USR1 信号。这个事件告诉 parent 听特定的 child 。
child :
kill USR1 => $parentPID if($customEvent);
syswrite($parentPipe, $msg, $buffer);
#select $parentPipe; print $parentPipe $msg;
家长:
$SIG{USR1} = {
#get child pid?
sysread($array[$pid]{'childPipe'}, $msg, $buffer);
};
  • 但是我如何获得向 parent 发出信号的源/子 pid?
    让 child 在信息中表明自己的身份。
  • 如果两个 child 同时发出 USR1 信号会发生什么?

  • 更新 2:解决方案
    我选择了一个使用矢量方法进行非阻塞 IO 的选择。
    对于那些遇到此线程的人,请查看: Perl Cookbook: 7.22. Reading from Many Filehandles Without Blocking因为它涵盖了向量方式和 IO::Select 模块。我知道 IO::Select 模块会更优雅,但我对学习 Perl 的新机制更感兴趣。感谢大家的帮助。
    发挥:
    $rin = '';
    # repeat next line for all filehandles to poll
    vec($rin, fileno(FH1), 1) = 1;
    vec($rin, fileno(FH2), 1) = 1;
    vec($rin, fileno(FH3), 1) = 1;

    $nfound = select($rout=$rin, undef, undef, 0);
    if ($nfound) {
    # input waiting on one or more of those 3 filehandles
    if (vec($rout,fileno(FH1),1)) {
    # do something with FH1
    }
    if (vec($rout,fileno(FH2),1)) {
    # do something with FH2
    }
    if (vec($rout,fileno(FH3),1)) {
    # do something with FH3
    }
    }

    最佳答案

    如果您想做事件驱动编程,请查看其中一个 CPAN 事件模块,例如 POE , Coro , 或 AnyEvent在你发明你自己的东西之前。
    2020 年更新
    我正在使用 Mojo::EventEmitter ,我在我的书 Mojo Web Clients 中对此进行了简要介绍.

    关于perl - 我可以在我的 Perl 程序中使用 POSIX 信号来创建事件驱动编程吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2570019/

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