进程管理

上一篇 / 下一篇  2008-11-17 21:45:13 / 个人分类:perl

  • 文件版本: V1.0
  • 开发商: 本站原创
  • 文件来源: 本地
  • 界面语言: 简体中文
  • 授权方式: 免费
  • 运行平台: Win9X/Win2000/WinXP
通过perl直接启动其它程序。51Testing软件测试网!j1x9d H:n`

9t5jr!U5H%o"]0system
函数51Testing软件测试网t#]fq2\1g8@9C`{ N
system "date";        
启动unix系统的date命令。51Testing软件测试网5I"a_PqN.Y;UF[2O
子进程会运行date命令,它将继承perl的标准输入,标准输出和标准错误。
v}2jPB&[Z H |d0system 'ls -l $HOME';    
注意是用单引号,因为$HOMEshell变量,否则,shell就看不到美元符号。表明要替换的符号。
XPOXhZ'^0system "long_time_command&";    
把长时间运行的程序放在后台。51Testing软件测试网KB$FU1LY
system 'for i in *; do echo ==$1 ==; cat $i; done';    
可以写脚本
+E4kr D.rj6t7[t0
#u+j-pmzy0
避免shell51Testing软件测试网G @9j(D _xd
调用system操作符时带多个参数,此时shell就不会卷入。如:
51Testing软件测试网g#T._ ]9i[ m"k3[E
system "tar","cvf",$aaa,@bbb;    
第一个命令是tar,其余的参数会一个一个传递给它。51Testing软件测试网8\M:a}rS1x ] Q
system
的退出状态基于子进程的退出状态。在unix0表示正常,非0表示出错。51Testing软件测试网;TmF,M0]&B9ae ~
unless (system "date") {    
返回0表示成功
b;N*y'd/[}'zq4C0    print "we gave you a date,ok!\n";
}^)K9V&S$| _@0    }
W-D'Z;A/TUM aZ051Testing软件测试网4Q8PR(J)]
exec
函数
`,kJd!k0
system差不多,system会生成一个子进程,exec是让perl进程本身去处理所要求的动作。51Testing软件测试网{*cI#y ha
一般用system就可以了。51Testing软件测试网!Mz9B)j kFR,t
51Testing软件测试网^ Gxl9a2Q d$k+VMI
环境变量
8@k9Q ]A cxu0
当你启动一个新进程时,环境变量就被继承下来了。在perl中,通过特殊的%ENV散列得到环境变量,散列中每个键表示一个环境变量。在你的程序刚开始执行时,%ENV就从父进程(通常是shell)继承而来。修改这个散列就改变了环境变量,它又会被新进程继承。$ENV {'PATH'} = "/home/mydir/bin:$ENV{'PATH'}";      设置新的环境变量,增加了一个路径51Testing软件测试网9i ^+[o9C?(w/Vj!i
delete $ENV{"IFS"};                    
删除“IFS”这个路径
)y6sk-F9HWdx;I0my $make_result = system "make";            
在新环境变量中执行程序51Testing软件测试网{6Qd:e,v c

/nc u$\qds0
使用反引号捕获输出51Testing软件测试网Q^'v/\KR5JPs2Y
当使用system and exec时,所启动命令的输出都被送到perl的标准输出上。有时我们需捕获这些输出。51Testing软件测试网w,],y1W/k6nz7n4H4kT
my $now = `date`;
XR:a,fS o0print "the time is now $now.";        
已经有换行符,不用加\n51Testing软件测试网#Kn5]8OZQ Z |~q2r
shell差不多。但它把行尾去掉,而perl的输出包含\n。所以要得到同样的效果,需加上chomp操作。
F3A1~dz? Zzh051Testing软件测试网3Zw LK4Vf/`$`
在列表上下文中使用反引号
$VS(Q'I~-]2b0my $who_text = `who`;    
标量上下文,得到一个长字符串。    
+D:`%m:i:y0D5r0my @who_lines = `who`;    
列表上下文,得到一个按行分开的数据。

$j'es{{]I051Testing软件测试网 Ar,VN S%v-o1\
文件句柄形式进程
&Cl8W#?Ca8f/L'N"M0perl
可以启动一个处理活动状态的子进程。启动一个并发子进程的语法是把命令当做文件名”用在open调用中,在命令之前或之后加一个竖线,这是一个管道字符,因些,这通常被称为管道打开(piped open)。51Testing软件测试网/t^(Pg:b%KAs)s
open DATE, "date|" or die "cannot pipe from date:$!";51Testing软件测试网h0u*Urwa5n"x
竖线在右边,其标准输出与文件句柄DATE连接,就像shell中的date | your_program51Testing软件测试网(o;[5wg,bz I
open MAIL, "|mail merlyn" or die "cannot pipe to mail:$!";51Testing软件测试网KrklO"u,`m0V
竖线在左边,命令的标准输入文件句柄MAIL连接,就像shell中的your_program | mail51Testing软件测试网'Miw/["A%ick
命令启动后是个独立于perl的进程。51Testing软件测试网_ KC3Cu1P9n/z%i
51Testing软件测试网;s+k!juy2]Q#\ rXv,u
要读取一个为读而打开的文件句柄,我们只需进行普通的读:
X:i}#I;V3|U0my $now = <DATE>;
0xB2ZMT0
要想给邮件进程发送数据,一人简单的“带文件句柄的打印”就可以了:
-l{FV Mb8Y)P!YU0print MAIL "the time is now $now.";
#B9eK alBb*i(q0c0
c0x!] xNC0
fork进行深入和复杂的工作51Testing软件测试网U,Ma0d+_Z
用低级系统调用实现system "date";命令。
|x&m.P+s0defined (my $pid = fork ) or die "cannot fork:$!";51Testing软件测试网 QbC'B+g)Je
unless ($pid) {51Testing软件测试网 oh-JL p3F
    exec "date";51Testing软件测试网.@8|tR#P7c5kZ$SK
    die "cannot exec date:$!";
(t;{T"iNv8V4Z0    }51Testing软件测试网:y9mQj,Ga
waitpid($pdi.0);51Testing软件测试网n)pE$BF:\"B W

{4ctQ8j k0
发送和接收信号51Testing软件测试网(j Be%W9b)Y+`R
4201发送一个SIGINT
!jI)[)|0LQ0kill 2, 4201 or die "cannot signal 4201 with SIGINT:$!";51Testing软件测试网CH L7seh
你也可用“INT”替代这里的2,因为2号信号就是SIGINT51Testing软件测试网3I)M/D MJ?.I0P:\9`

~DP\2F%Y:qu0
信号0表示,看看我能不能发一个个信号,但我并不想现在发送。因此可用以进程探测。
,A:UT#UFs0W/|0unless (kill 0,$pid) {51Testing软件测试网-FlA ~;h|k8x6L6Vs
    warn "$pid has gone away!";51Testing软件测试网-f8Pqy!g1@+`eh{!X`
    }

TAG: Perl perl

 

评分:0

我来说两句

Open Toolbar