教程 > perl 教程 > 阅读:8

perl 进程管理——迹忆客-ag捕鱼王app官网

perl 中你可以以不同的方法来创建进程。

本教程将讨论一些进程的管理方法。

  • 你可以使用特殊变量 $$ 或 $process_id 来获取进程 id。
  • %env 哈希存放了父进程,也就是shell中的环境变量,在perl中可以修改这些变量。
  • exit() 通常用于退出子进程,主进程在子进程全部退出后再退出。
  • 所有打开的句柄会在子程序中被 dup() 函数复制, 所有关闭进程所有句柄不会影响其他进程 。

反引号运算符

使用反引号运算符可以很容易的执行 unix 命令。你可以在反引号中插入一些简单的命令。命令执行后将返回结果:

#!/usr/bin/perl
@files = `ls -l`;
foreach $file (@files){
   print $file;
}
1;

执行以上程序,输出结果如下:

drwxr-xr-x 3 root root 4096 sep 14 06:46 9-14
drwxr-xr-x 4 root root 4096 sep 13 07:54 android
-rw-r--r-- 1 root root  574 sep 17 15:16 index.htm
drwxr-xr-x 3  544  401 4096 jul  6 16:49 mime-lite-3.01
-rw-r--r-- 1 root root   71 sep 17 15:16 test.pl
……

system() 函数

你也可以使用 system() 函数执行 unix 命令, 执行该命令将直接输出结果。默认情况下会送到目前perl的stdout指向的地方,一般是屏幕。你也可以使用重定向运算符 > 输出到指定文件:

执行以上程序,输出结果如下:

drwxr-xr-x 3 root root 4096 sep 14 06:46 9-14
drwxr-xr-x 4 root root 4096 sep 13 07:54 android
-rw-r--r-- 1 root root  574 sep 17 15:16 index.htm
drwxr-xr-x 3  544  401 4096 jul  6 16:49 mime-lite-3.01
-rw-r--r-- 1 root root   71 sep 17 15:16 test.pl
……

你需要注意命令包含环境变量如 $path 或 $home 的输出结果,如下所示:

#!/usr/bin/perl
 
$path = "我是 perl 的变量";
 
system('echo $path');  # $path 作为 shell 环境变量
system("echo $path");  # $path 作为 perl 的变量
system("echo \$path"); # 转义 $
 
1;

执行以上程序,输出结果如下:

/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin
我是 perl 的变量
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin

fork() 函数

perl fork() 函数用于创建一个新进程。

在父进程中返回子进程的pid,在子进程中返回0。如果发生错误(比如,内存不足)返回undef,并将$!设为对应的错误信息。

fork 可以和 exec 配合使用。exec 函数执行完引号中的命令后进程即结束。

#!/usr/bin/perl
 
if(!defined($pid = fork())) {
   # fork 发生错误返回 undef
   die "无法创建子进程: $!";
}elsif ($pid == 0) {
   print "通过子进程输出\n";
   exec("date") || die "无法输出日期: $!";
  
} else {
   # 在父进程中
   print "通过父进程输出\n";
   $ret = waitpid($pid, 0);
   print "完成的进程id: $ret\n";
 
}
 
1;

执行以上程序,输出结果如下:

通过父进程输出
通过子进程输出
2016年 6月19日 星期日 22时21分14秒 cst
完成的进程id: 47117

如果进程退出时,会向父进程发送一个chld的信号后,就会变成僵死的进程,需要父进程使用wait和waitpid来终止。当然,也可以设置$sig{chld}为ignorg:

#!/usr/bin/perl
 
local $sig{chld} = "ignore";
 
if(!defined($pid = fork())) {
   # fork 发生错误返回 undef
   die "无法创建子进程: $!";
}elsif ($pid == 0) {
   print "通过子进程输出\n";
   exec("date") || die "无法输出日期: $!";
  
} else {
   # 在父进程中
   print "通过父进程输出\n";
   $ret = waitpid($pid, 0);
   print "完成的进程id: $ret\n";
 
}
 
1;

执行以上程序,输出结果如下:

通过父进程输出
通过子进程输出
2016年 6月19日 星期日 22时30分56秒 cst
完成的进程id: -1

kill 函数

perl kill('signal', (process list))给一组进程发送信号。signal是发送的数字信号,9为杀掉进程。

首先看看linux中的常用信号,见如下列表:

信号名          值          标注          解释
————————————————————————————————————————————————————————————
hup             1           a             检测到挂起
int               2           a             来自键盘的中断
quit            3           a             来自键盘的停止
ill               4           a             非法指令
abrt          6           c             失败
fpe             8           c             浮点异常
kill             9           af            终端信号
usr1          10          a             用户定义的信号1
segv          11          c             非法内存访问
usr2          12          a             用户定义的信号2
pipe           13          a             写往没有读取者的管道
alrm         14          a             来自闹钟的定时器信号
term         15          a             终端信号
chld          17          b             子进程终止
cont         18          e             如果被停止则继续
stop         19          df            停止进程
tstp          20          d             tty键入的停止命令
ttin            21          d             对后台进程的tty输入
ttou          22          d             对后台进程的tty输出

以下实例向进程 104 和 102 发送 sigint 信号:

#!/usr/bin/perl
 
kill('int', 104, 102);
 
1;

查看笔记

扫码一下
查看教程更方便
网站地图