在Perl中,如何进行非阻塞系统调用?

时间:2009-10-20 17:44:21

标签: perl

在Perl中,不使用Thread库,产生系统调用的最简单方法是什么,以便它是非阻塞的?您是否可以在避免fork()的同时执行此操作?

EDIT 澄清。我想避免对fork进行明确而混乱的调用。

2 个答案:

答案 0 :(得分:10)

你的意思是这样吗?

system('my_command_which_will_not_block &');

正如Chris Kloberdanz指出的那样,这将隐式调用fork() - perl实际上没有其他办法可以做到这一点;特别是如果你希望perl解释器在命令执行时继续运行。

命令中的&字符是一个shell元字符 - perl看到这个并将参数传递给shell(通常是bash)以便执行,而不是直接运行它system()来电。 execv()告诉bash再次fork,在后台运行命令,然后立即退出,在命令继续执行时将控制权返回给perl。

答案 1 :(得分:4)

上面的帖子说“perl没有其他方法可以做到这一点”,但事实并非如此。

由于您提到了文件删除,请查看IO::AIO。这在另一个线程(POSIX线程,而不是Perl伪线程)中执行系统调用;您使用aio_rmtree安排请求,完成后,模块将调用程序中的函数。与此同时,您的程序可以执行其他任何操作。

在另一个POSIX线程中执行操作实际上是一种非常有用的技术。 (一个特殊的黑客版本)Coro使用它来抢占协同程序(时间切片),EV :: Loop :: Async使用它来传递事件通知,即使Perl正在做一些事情而不是等待事件。