Perl进程管理
1. system函数
- 在perl中启用子进程的最简单的方法是使用system函数,如需要使用perl调用 Unix 的 date 命令,告诉 system 要虚运行的外部程序的名称即可: system ‘date’;
- perl运行的程序成为父进程;
- system根据当前进程创建一份拷贝,这份拷贝被称作子进程;
- 子进程会继承父进程的标准输入、标准输出以及标准错误;
- 一般 system 函数的参数就是那些在shell中常常键入的命令,可以使用比较复杂的命令:
- 如: system ‘ls -l $HOME’; system ‘ls -l \$HOME’;
- $HOME是shell的环境变量,如果使用双引号,记得进行转义,以免 perl 理解为变量内插;
- 子进程正在运行时,Perl会等待子进程结束才能进行下一步的程序;
- 使用shell提供的功能进行后台启动: system ‘long_running_time_command &’;
- 参数中的 & ,可以让shell在后台执行命令,Perl可以直接开始下一行程序;
- 避免使用shell:
- system操作符也可以用多个参数调用,这样无论给的文本多么复杂,都不会调用shell
- 使用多个参数调用时,即使参数中出现对shell有意义的字符,如* | 等,都不会背shell误解为特殊含义;
#!/usr/bin/perl
my $tarfile = 'somthing*wicked.tar';
my @dir = qw/fred|flintston <barney&rubble> betty/;
system 'tar','cvf',$tarfile,@dir;
# tar 命令名称
# cvf 命令参数
# $tatfile @dir 命令参数
- system函数的返回值
- system的返回值由子进程的结束状态来决定;
- 在Unix中: 0 表示成功;非零值表示子进程运行有问题(不同值代表不同错误类型);
- system的返回值是一个高低各 8 位的字节,高8位是程序的退出码,低8位包含了很多信息,如最高一位表示程序运行时是否发生了core dump事件。
2. 环境变量
2.1 环境变量
- 最典型的环境变量是PATH,在Unix中PATH是以冒号隔开的目录列表,其元素是可执行文件的搜索路径,当输入rm fred这样的命令时,系统会在目录列表中依次寻找 rm 命令;
- Perl 会在需要的时候用PATH来检索可执行程序,启动之后该程序如果需要调用其他程序,也会使用PATH进行搜索;
- Perl 中可以通过%ENV哈希取得,其中每个键都代表一个环境变量;
- 程序开始运行时,%ENV会保留从父进程继承来的设定值,修改哈希值就能修改环境变量;
- 修改后的环境变量可以被子进程继承;
- 子进程会继承父进程的环境变量,当前工作目录,标准输入,标准输出,标准错误和其他的"小秘密";
- 假如需要运行系统的 make 程序,并且想用私有目录作为查找make的首选位置,并且希望禁用(make和其他程序敏感的) IFS环境变量:
#!/usr/bin/perl
$ENV{
'PATH'} = "home/rootneer/bin:$ENV{PATH}";
delete $ENV{
'IFS'};
my $make_result = system 'make';
2.2 exec函数
截止目前为止,涉及到的system的相关操作都可以用于exec函数;
- sytem 和 exec 的区别
- system 会创建子进程,子进程在perl睡眠期间执行任务;
- exec 使当前进程自己去执行任务,像是goto,而不是就地调用子程序;
- 当我们需要利用perl为其他程序设置环境变量的时候,使用 exec 就可以提升效率:
- 使用 exec 函数时,perl 不会等待 exec 结束才结束,一旦跳转至 exec,perl 进程就结束;
- 使用 system 函数时,perl 会等待 system 调用的子程序结束,然后 perl 程序才能结束,浪费系统资源;
- 一旦执行 exec 的程序,perl 便放手退出,因此 exec 之后的任何代码都无法运行,除非启动 exec 程序出错。
#!/usr/bin/perl