Perl-进程管理

[b][size=large][align=center]Perl-进程管理[/align][/size][/b]

1.system函数

在perl中,启动子进程最简单的方法是用system函数。

1.1 简单命令

例如要从perl调用Unix的date命令,需要启用如下代码:

system "date";

这回创建一个子进程来运行date命令,并且它继承了perl的标准输入,标准输出和标准出错。这意味着date通常输出的日期时间字符串并会送到目前perl的STDOUT指向的地方。

1.2 复杂命令

比较复杂的命令要放在参数里:

比如:

system 'ls -l $HOME';

请注意这里的 $HOME是shell变量,所以用的不是双引号,而是单引号。否则,因为美元符号也是perl进行变量内插的符号,所以shell看不到它。

2 exec函数

到目前为止,我们提到的system所有的语法都适用于exec函数,当然有一个例外,system函数会创建子进程,子进程会在perl休眠时执行任务。而exec函数却导致perl进程自己去执行任务。这类似于子程序调用与goto的差别。

比如:
exec "bedchock", "-o","args1",@ARGV;

当运行到exec操作符时,perl会找到bedchock程序并且“跳进去”执行,就不会再有perl进程了,只有那个bedchock进程。

一旦启动要执行的程序,Perl便会自动放手退出,因此exec调用之后写的代码都不发运行,除非在编程接管启动过程中的错误:

exec "date";
die "date could't run:$!";。

3.用反引号捕获输出结果

无论用system还是exec,被调用程序的输出都会定向到Perl的标准输出。有时候我们感兴趣就在于捕获输出的字符串,并进一步处理。这其实只要以魔力反引号来代替单引号和双引号。

open DATE, "date|" or die "cannot pipe from date: $!";
my $now = `date`;
print "The time is $now";

当我们把date放在反引号里时,Perl会执行这个命令并将其标准输出结果一字符串的形式捕获。在这个例子中,字符串会赋给$now。

4.将进程视为文件句柄

到目前为止,我们看到的方法都是由Perl同步控制子程序:启动一个命令,然后等着它结束或许还会捕获其结果输出。但是perl其实也可以启动一个异步运行的子程序,并和他保持通信,直到子程序结束为止。

例如:

open DATE "date|" or die "cannot pipe from date:$!";
my $now = <DATE>;
print "The time is now $now";


上面的例子,竖线在命令的右边,表示该命令执行时他的标准输出会转向只读文件句柄DATE。

为什么要用文件句柄的方式和进程打交道呢,假如要根据计算结果来决定写到其它进程的数据,这是唯一简单做法。可是如果只想读取,反引号通常是易于使用。然而如果子进程不时有数据要送往父进程,就必须用管道了。


open F,"find / -atime +90 size +1000 -print |" or die "fork:$!";
while(<F>){
chomp;
printf "%s size %dK last accessed on %s\n", $_, (1023 + -s $_)/1024, -A $_;
}


find命令这次运行是要查找那些90天内未被存取过的1000块以上的大文件,他们非常适合被鬼党委永久性介质中。在find工作的时候,Perl会等待。没找到一个文件,perl会立刻收到文件名并进一步显示文件的相关信息工分析。如果我们用反引号的话,就得等到find彻底搜完才能看到第一行输出。从任务监控角度来说,往往看到执行的最新进展才能让人放心。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值