[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其实也可以启动一个异步运行的子程序,并和他保持通信,直到子程序结束为止。
例如:
上面的例子,竖线在命令的右边,表示该命令执行时他的标准输出会转向只读文件句柄DATE。
为什么要用文件句柄的方式和进程打交道呢,假如要根据计算结果来决定写到其它进程的数据,这是唯一简单做法。可是如果只想读取,反引号通常是易于使用。然而如果子进程不时有数据要送往父进程,就必须用管道了。
find命令这次运行是要查找那些90天内未被存取过的1000块以上的大文件,他们非常适合被鬼党委永久性介质中。在find工作的时候,Perl会等待。没找到一个文件,perl会立刻收到文件名并进一步显示文件的相关信息工分析。如果我们用反引号的话,就得等到find彻底搜完才能看到第一行输出。从任务监控角度来说,往往看到执行的最新进展才能让人放心。
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彻底搜完才能看到第一行输出。从任务监控角度来说,往往看到执行的最新进展才能让人放心。