Perl中"系统"功能的背后是什么?

Joh*_*nGa 4 perl

我可以认为它将打开一个shell,执行参数(shell命令)并以标量返回结果.但是,在Perl脚本中执行系统功能比shell命令更快.它会在C中调用此命令吗?如果是,那么它们之间有什么区别

rmdir foo
Run Code Online (Sandbox Code Playgroud)

system('rmdir foo');
Run Code Online (Sandbox Code Playgroud)

DVK*_*DVK 11

  1. 两者之间的区别在于第二个将打开(fork)子进程(将是rmdir命令),而第一个将使用API​​进行直接Unix系统调用而无需打开进程.打开子进程是昂贵的资源.

  2. system() call将始终打开一个子进程来执行,但是,它可以打开一个shell,然后将所需的程序作为自己的子进程分叉(从而产生2个子进程),或者将程序作为子进程分叉直.

    Perl将在system()调用期间打开shell的选择在perldoc -f系统中详细说明.短(而非100%准确)版本是:

    • 如果系统调用只有一个参数,并且参数的计算结果为包含shell元字符的字符串,则首先分叉一个shell.

    • 如果只有一个参数并且它的计算结果为无元字符; 或者有一个> 1元素的参数列表,程序直接绕过shell分叉.

从而:

system("rmdir foo"); # forks off rmdir command directly

system("rmdir", "foo"); # forks off rmdir command directly

system("rmdir foo > out.txt"); # forks off a shell because of ">" 
Run Code Online (Sandbox Code Playgroud)


rjh*_*rjh 5

您的system调用将启动一个单独的进程,而Perl自己rmdir将在Perl进程的上下文中调用本机C函数.两种方法最终都会执行相同的系统调用,但打开新进程效率较低.*

最好使用Perl自己的函数(例如rmdir):它们是可移植的,您不必担心解释shell退出代码,转义文件名中的元字符以防止安全风险等.

*如果您的命令包含管道,输入/输出重定向等,system将创建一个额外的sh进程&&.这不适用于您的情况,但可以使system选项更慢.