【问题标题】:perl: thread termination blocked by user inputperl:线程终止被用户输入阻塞
【发布时间】:2026-01-17 22:20:02
【问题描述】:

我制作了一个可以以两种方式终止的程序,用户输入一个字符串say-“kill”或特定线程发出信号 SIGINT。

在这个终结者线程中我有一个语句(捕捉“杀死”):

    $a = <>;

后跟一个'return;' 我在顶部也有适当的信号处理程序(用于 INT):

print "signal received\n";
threads->exit(); 

但是在自动终止的情况下(即 SIGINT 是从其他线程发送的),打印 stmt 直到我按下某个键才出现,无论我等待多长时间。我想 正在阻塞。

有人可以告诉我如何在自动终止的情况下向 提供某种输入,以便立即查看结果。

谢谢。

【问题讨论】:

  • 在对 的调用中,您的线程已将控制权交给了操作系统。所以,是的,它会阻塞直到 eof。
  • 如果你想闯入,你需要除了 line-i/o 以外的东西。

标签: multithreading perl signals


【解决方案1】:

你不能按照你试图做的方式去做你想做的事。如果正在读取文件,并且“等待输入”,则进程进入不间断的等待状态。此时您基本上不能通过信号中断它。不间断等待是内核的事情,关键是防止文件损坏。

要做你想做的事,你可能需要使用IO::Selectcan_read 函数。您可以在轮询循环中测试哪些文件句柄已准备好进行 IO - 此轮询循环 可被终止信号中断。

或者,您可以使用Term::ReadKey,而不是使用文件句柄读取,这将允许您以非阻塞方式捕获按键

【讨论】:

    最近更新 更多