扫码一下
查看教程更方便
perl 中你可以以不同的方法来创建进程。
本教程将讨论一些进程的管理方法。
使用反引号运算符可以很容易的执行 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() 函数执行 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
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
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;