Perl 教程 之 Perl 进程管理 4
Perl 进程管理
Perl 中可以以不同的方法来创建进程。
可以使用特殊变量 $$ 或 $PROCESS_ID 来获取进程 ID。
%ENV 哈希存放了父进程,也就是shell中的环境变量,在Perl中可以修改这些变量。
exit() 通常用于退出子进程,主进程在子进程全部退出后再退出。
所有打开的句柄会在子程序中被 dup() 函数复制, 所有关闭进程所有句柄不会影响其他进程 。
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