Learning Perl(Perl语言入门)学习笔记(13)

 

第十四章  进程管理

 

1、  Perl中,可以利用system 函数启动子进程,子程序执行相应的命令并继承Perl的标准输入、标准输出以及标准错误;通常提供给system 函数的参数就是一般在shell所键入的命令,当参数里有类似于“$HOME”的环境变量时,应该将参数放在单引号中(双引号中$开头的字符串会被当作变量进行替换)或者入在双引号中并将符号“$”进行转义;

2、  当子进程运行时,Perl会一直等待直到子进程结束,当然也可以将子进程放在后台进行,这种情况下Perl将无以得知子进程的存在及运行状况;当命令“很简单”时,Perl不会用到shell,而是直接启动命令,并会在必要时使用继承而来的PATH变量;

3、  使用system 函数时,如果为其指定了多个参数(多个参数间要互相隔离),则函数的整个执行过程不会用到shell,如:

system “/bin/sh”, “-c”, $command_line

Unix中,函数执行返回0表示一切正常,非0表示不执行不成功,这恰与Perl的函数相反;

4、  不同于system 函数会让Perl暂停并创建一个子进程来执行所要求的命令,exec 函数会让Perl进程自己去执行所要求的命令,此时,Perl会找到并启动指定的程序而后“跳进该程序”,而原有的Perl进程将不再存在,程序执行结束后因而也没有Perl进程可以返回,于是会直接返回至提示符下;exec 函数很少单独使用,更多的是和fork一起使用;

5、  在启动其它进程时,有时候需要设定其运行环境;Perl中,环境变量可通过特殊散列%ENV取得,其中每个散列键都代表一个环境变量;在程序开始运行时,%ENV会保留从父进程(通常是shell)继承而来的设定值,因而,可以通过改变散列来改变所要用到的环境变量;

6、  使用system exec 时,也可以对其执行结果进行捕获并保存至变量(可以是标量,也可以是列表)中,方法是使用反引号“`”来代替双引号或单引号,反引号里要执行的命令相当于system 的单参数形式,并且会以被双引号揪住的字符串的形式进行解释,里面的反斜线转义序列与变量都会被适当地展开;如:

     $mydate = `date`;

7、  反引号要等效于单引号会很麻烦,也没有简单的办法使之对应到system 的多参数版本,而且如果反引号内的命令很复杂的话,shell(通常是/bin/sh)就会被自动启动并用来解释该命令;使用单引号时即便不用变量捕获其输出,Perl依然会浪费力气地获取其输出结果;此外,反引号内的程序会继承Perl的标准输入和输出,因此,其错误信息输出会被送往当前标准输出,也会在需要时从当前标准输入等待输入信息,而这些命令不是由当前用户自己启动,因此用户可能会在看到这些信息时迷惑不解;因此,慎用反引号;

8、  如果反引号中程序的输出有许多行,那么在标量上下文会返回成一个长字符串,而在列表上下文会返回由各行输出组成的列表;

9、  如前面的执行方式,处理同步进程的方法都是由Perl 掌控全局:启动一个命令,然后等着它结束,或许还会获取其输出;不过,Perl也可以启动子进程,直到结束之前,它们都会持续和Perl交换信息;要启动并发子进程,需要将命令放在open 调用的文件名部分,并且在它前面或者后面加上竖线符号“|”,这种方法即将进程视为文件句柄,也称为管道式打开;如:

     open DATE, “date|” or die  “Cannot pipe from date: $!”;

     open MAIL, “|mail  merlyn” or die “Cannot pipe to mail: $!”;

   竖线符号在右边表示该命令执行时它的标准输出会连接到供程序读取的相应句柄,于是第一个例子就像在shell中输入 date | your_program 一样;竖线符号在左边表示该命令的标准输入会连接到供程序写入的相应文件句柄,如第二例形如your_mail | mail Merlyn 命令;

10、              如此,想要从“以读取模式打开的文件句柄”中取得数据,只要采用正常的文件读取方式就可以了,如:my $now = <DATE>; 想传递数据给“以等待读入数据模式打开的文件句柄”进程,只要利用输出至文件句柄的print运算即可,如:print MAIL “The time is now $now”; 

Perl可以对Unix 以及其它系统上“管理进程用的低级系统调用”进行近乎直接的控制,如使用fork函数来创建进程;当调用fork函数时,如果是调用系统的fork 函数来创建一个新的进程,就是通过复制解释器来模仿它;调用fork函数时,如果调用成功,就会创建一个等同于父进程的子进程,该子进程继承了父进程的所有属性,比如环境变量;两个进程间的唯一差别在于fork调用的返回值,在子进程中,返回0,在父进程中,返回子进程的PID;如果fork 不成功,会返回undef

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值