gpt4 book ai didi

perl - 在 Perl 中的进程之间发送消息

转载 作者:行者123 更新时间:2023-12-05 00:24:53 25 4
gpt4 key购买 nike

我正在尝试使用信号实现进程之间的通信。首先父进程启动子进程,它做一些工作,然后等待来自子进程的消息,然后再次向子进程发送信号,这样子进程就可以继续处理等等。

我不确定实现这一点的正确方法是什么,但这是我的第一次尝试:

use warnings;
use strict;
use feature qw(say);

my $forever=1000000;
my $parPID=$$;
my $child = fork();
if( $child == 0 ){
runSubProc($parPID,$forever);
}

$SIG{"USR1"}=sub {
say "Parent: got signal 1";
$SIG{"USR1"}=sub {
say "Parent: got signal 2";
exit 0;
};
sleep 5;
kill 'USR1', $child;
sleep $forever;
};

say "Waiting for child processes..";
sleep $forever;


sub runSubProc {
my ($parPID,$forever)=@_;

$SIG{"USR1"}=sub {
say "Child: got signal 1";
$SIG{"USR1"}=sub {
say "Child: got signal 2";
exit 0;
};
sleep 7;
kill 'USR1', $parPID;
sleep $forever;
};
sleep 5;
kill 'USR1', $parPID;
sleep $forever;
}

这不起作用,输出是:
Waiting for child processes..
Parent: got signal 1
Child: got signal 1

然后它挂了..

最佳答案

根本原因是你的sleep $forever在信号处理程序中。因为您的进程已经在处理“SIGUSR1”,所以不会处理下一个终止​​信号 - 这是为了避免信号中断信号的各种讨厌。避免任何会在处理程序中阻塞的东西。

这似乎有效:

$SIG{'USR1'} = \&handle_USR1;

my $ppid = $$;
my $child_pid = fork();

sub handle_USR1 {
if ( $signalled++ ) { print "$$: got second USR1\n"; exit 0 }

print "$$: caught SIGUSR1\n";
if ( not $child_pid ) {
print "$$: Child got a SIGUSR1\n";
sleep 7;
print "$$: (child) sending signal to $ppid\n";
kill 'USR1', $ppid;
} else {
print "$$: (parent) got USR1\n";
sleep 5;
print "$$: parent signalling child\n";
kill 'USR1', $child_pid;
}
}

if ($child_pid) {
print "$$ ( parent ) waiting\n";
sleep 500;
} else {
print "$$: (child) waiting\n";
sleep 5;
print "$$: Child signalling $ppid\n";
kill 'USR1', $ppid;
sleep 500;
}

您可能需要稍微调整一下,但核心点是 - 动态重新定义您的信号处理程序,尤其是通过将 sleep 放在那里来“拖延”它们会破坏信号机制。

关于perl - 在 Perl 中的进程之间发送消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25569130/

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