我想在 perl 中执行一个子进程。我还希望我的代码独立于平台(对于 windows 和 unix 都是一样的,除了文件路径等一些小故障)。
问题是在windows中fork的perl实现,是一个伪进程,实际上是一个线程。请在此处参考 windows 的 perl fork 仿真。
它还提到了伪进程的执行kill
和命令问题。exec
为不同的平台使用两个不同版本的 fork 是否安全,或者我应该使用特定于操作系统的 API?
Forks::Super
已经担心并解决了很多这些可移植性问题,让您可以便携地运行代码,例如
use Forks::Super;
$pid = fork();
if ($pid != 0) {
...
if (kill 'ZERO',$pid) { print "Job is running.\n"; }
kill 'STOP', $pid; # or $pid->suspend
kill 'CONT', $pid; # or $pid->resume
kill 'TERM', $pid; # or $pid->terminate
waitpid $pid, 0; # or $pid->wait or $pid->waitpid(0)
}
假设您需要异步进程,请使用特定于平台的 API(如果您可以等待子进程,则可以使用system
or qx
)。
那是fork
/exec
在 UNIX 上,Win32::Process::Create
在 Windows 上。Windows 上的 fork 仿真是一次勇敢的尝试,但平台在这方面是如此不同,我认为你在尝试产生一个可以满足所有条件的便携式解决方案时比较松散。
示例:python 试图将接口与其subprocess
模块统一起来。它适用于简单的东西,但有 4 个 UNIX 特定参数和 2 个 Windows 特定参数(到 Popen)。