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

第十四章  进程管理
 
一、  Perl 中,能够利用system 函数启动子进程,子程序执行相应的命令并继承Perl的标准输入、标准输出以及标准错误;一般提供给system 函数的参数就是通常在shell所键入的命令,当参数里有相似于“$HOME”的环境变量时,应该将参数放在单引号中(双引号中$开头的字符串会被看成变量进行替换)或者入在双引号中并将符号“$”进行转义;
二、  当子进程运行时,Perl会一直等待直到子进程结束,固然也能够将子进程放在后台进行,这种状况下Perl将无以得知子进程的存在及运行情况;当命令“很简单”时,Perl不会用到shell,而是直接启动命令,并会在必要时使用继承而来的PATH变量;
三、  使用system 函数时,若是为其指定了多个参数(多个参数间要互相隔离),则函数的整个执行过程不会用到shell,如:
system “/bin/sh”, “-c”, $command_line
Unix中,函数执行返回0表示一切正常,非0表示不执行不成功,这恰与Perl的函数相反;
四、  不一样于system 函数会让Perl暂停并建立一个子进程来执行所要求的命令,exec 函数会让Perl进程本身去执行所要求的命令,此时,Perl会找到并启动指定的程序然后“跳进该程序”,而原有的Perl进程将再也不存在,程序执行结束后于是也没有Perl进程能够返回,因而会直接返回至提示符下;exec 函数不多单独使用,更多的是和fork一块儿使用;
五、  在启动其它进程时,有时候须要设定其运行环境;Perl中,环境变量可经过特殊散列%ENV取得,其中每一个散列键都表明一个环境变量;在程序开始运行时,%ENV会保留从父进程(一般是shell)继承而来的设定值,于是,能够经过改变散列来改变所要用到的环境变量;
六、  使用system exec 时,也能够对其执行结果进行捕获并保存至变量(能够是标量,也能够是列表)中,方法是使用反引号“`”来代替双引号或单引号,反引号里要执行的命令至关于system 的单参数形式,而且会以被双引号揪住的字符串的形式进行解释,里面的反斜线转义序列与变量都会被适当地展开;如:
     $mydate = `date`;
七、  反引号要等效于单引号会很麻烦,也没有简单的办法使之对应到system 的多参数版本,并且若是反引号内的命令很复杂的话,shell(一般是/bin/sh)就会被自动启动并用来解释该命令;使用单引号时即使不用变量捕获其输出,Perl依然会浪费力气地获取其输出结果;此外,反引号内的程序会继承Perl的标准输入和输出,所以,其错误信息输出会被送往当前标准输出,也会在须要时从当前标准输入等待输入信息,而这些命令不是由当前用户本身启动,所以用户可能会在看到这些信息时疑惑不解;所以,慎用反引号;
八、  若是反引号中程序的输出有许多行,那么在标量上下文会返回成一个长字符串,而在列表上下文会返回由各行输出组成的列表;
九、  如前面的执行方式,处理同步进程的方法都是由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 命令;
十、              如此,想要从“以读取模式打开的文件句柄”中取得数据,只要采用正常的文件读取方式就能够了,如:my $now = <DATE>; 想传递数据给“以等待读入数据模式打开的文件句柄”进程,只要利用输出至文件句柄的print运算便可,如:print MAIL “The time is now $now”; 
Perl 能够对 Unix 以及其它系统上“管理进程用的低级系统调用”进行近乎直接的控制,如使用 fork 函数来建立进程;当调用 fork 函数时,若是是调用系统的 fork 函数来建立一个新的进程,就是经过复制解释器来模仿它;调用 fork 函数时,若是调用成功,就会建立一个等同于父进程的子进程,该子进程继承了父进程的全部属性,好比环境变量;两个进程间的惟一差异在于 fork 调用的返回值,在子进程中,返回 0 ,在父进程中,返回子进程的 PID ;若是 fork 不成功,会返回 undef
相关文章
相关标签/搜索