Tôi đang viết một kịch bản Perl sẽ viết một số đầu vào và gửi các đầu vào đó đến một chương trình bên ngoài. Có một nhỏ nhưng khác không cơ hội mà chương trình này sẽ treo, và tôi muốn để thời gian nó ra:Làm thế nào tôi có thể hết thời gian chờ một quá trình chia đôi có thể treo?
my $pid = fork;
if ($pid > 0){
eval{
local $SIG{ALRM} = sub { die "TIMEOUT!"};
alarm $num_secs_to_timeout;
waitpid($pid, 0);
alarm 0;
};
}
elsif ($pid == 0){
exec('echo blahblah | program_of_interest');
exit(0);
}
Khi đứng bây giờ, sau khi $ num_secs_to_timeout, program_of_interest vẫn còn dai dẳng. Tôi đã cố gắng xóa nó trong chương trình con ẩn danh cho $SIG{ALRM}
như sau:
local $SIG{ALRM} = sub{kill 9, $pid; die "TIMEOUT!"}
nhưng điều này không làm gì cả. program_of_interest vẫn còn tồn tại. Làm thế nào để tôi đi về việc giết chết quá trình này?
Tôi nghĩ rằng "giết 9, - $ PID" nên được "giết -9, $ PID". Tôi đã sử dụng hệ thống ("kill -9 $ PID"). – Boolean
Tôi nghĩ rằng "giết -9 $ PID" nên tiếp tục là "giết -9 $ pid", nhưng có, pid tiêu cực chỉ ra để giết một nhóm quá trình thay vì chỉ là một quá trình. Từ tài liệu giết: "Không giống như trong shell, nếu SIGNAL là tiêu cực, nó sẽ giết chết các nhóm tiến trình thay vì các tiến trình. (Trên hệ thống V, một số PROCESS âm cũng sẽ giết các nhóm tiến trình, nhưng đó không phải là di động.)" – simpleuser