是否有可能使用Perls系统函数的数组版本立即返回?

是否可以使用perls system命令的arrays版本(即,将第一个元素作为命令,将其余数组作为cmd参数的版本),同时也使用Linux产生新的进程,以便system命令立即返回例如运行一个像这样的命令:

 mycmd arg1 arg2 & 

我尝试过使用system( ('mycmd', 'arg1', 'arg2', '&') )但它只是将字符理解为第三个参数。

我知道我可以将整个命令作为标量传递给system但是我特别想知道是否可以使用数组版本,因为此命令的参数将源自CGI脚本中的用户选项。

shell命令的一部分告诉shell在后台运行进程,因此使用system的multi-arg形式绕过shell是没有意义的。

解决方案1:使用String :: ShellQuote引用。

 use String:ShellQuote qw( shell_quote ); system(shell_quote('mycmd', 'arg1', 'arg2').' &'); 

解决方案2:使用shell插值引用。

 system('sh', '-c', '"$@" &', 'sh', 'mycmd', 'arg1', 'arg2'); 

解决方案3:自己在后台启动程序。

 use IPC::Open3 qw( open3 ); { open(local *CHILD_IN, '<', '/dev/null') or die $!; local $SIG{CHLD} = 'IGNORE'; open3( '<&CHILD_IN', '>&STDOUT', '>&STDERR', 'mycmd', 'arg1', 'arg2', ); } 

既然你对执行的程序的命运没有兴趣,你可以使用fork / exec。 而你在Linux上允许使用$SIG{CHLD} = 'IGNORE'来避免等待子进程。

 sub background { local $SIG{CHLD} = 'IGNORE'; # fork and then exec if we are the child exec(@_) or die($!) unless fork; } background( 'mycmd', 'arg1', 'arg2' );