Perl进程管理

本文详细介绍了Perl中的进程管理,包括system函数的使用,环境变量的设置与获取,特别是exec函数与系统交互的方式,以及如何用反引号捕获输出结果。此外,还讲解了如何通过句柄执行外部进程并实现进程间通信,以及发送和接收信号的机制。
摘要由CSDN通过智能技术生成

Perl进程管理

1. system函数

  • 在perl中启用子进程的最简单的方法是使用system函数,如需要使用perl调用 Unix 的 date 命令,告诉 system 要虚运行的外部程序的名称即可: system ‘date’;
    • perl运行的程序成为父进程;
    • system根据当前进程创建一份拷贝,这份拷贝被称作子进程;
    • 子进程会继承父进程的标准输入、标准输出以及标准错误;
  • 一般 system 函数的参数就是那些在shell中常常键入的命令,可以使用比较复杂的命令:
    • 如: system ‘ls -l $HOME’; system ‘ls -l \$HOME’;
    • $HOME是shell的环境变量,如果使用双引号,记得进行转义,以免 perl 理解为变量内插;
  • 子进程正在运行时,Perl会等待子进程结束才能进行下一步的程序;
    • 使用shell提供的功能进行后台启动: system ‘long_running_time_command &’;
    • 参数中的 & ,可以让shell在后台执行命令,Perl可以直接开始下一行程序;
  • 避免使用shell:
    • system操作符也可以用多个参数调用,这样无论给的文本多么复杂,都不会调用shell
    • 使用多个参数调用时,即使参数中出现对shell有意义的字符,如* | 等,都不会背shell误解为特殊含义;
#!/usr/bin/perl
my $tarfile = 'somthing*wicked.tar';
my @dir = qw/fred|flintston <barney&rubble> betty/;
system 'tar','cvf',$tarfile,@dir;
# tar 命令名称
# cvf 命令参数
# $tatfile @dir 命令参数
  • system函数的返回值
    • system的返回值由子进程的结束状态来决定;
    • 在Unix中: 0 表示成功;非零值表示子进程运行有问题(不同值代表不同错误类型);
    • system的返回值是一个高低各 8 位的字节,高8位是程序的退出码,低8位包含了很多信息,如最高一位表示程序运行时是否发生了core dump事件。

2. 环境变量

2.1 环境变量

  • 最典型的环境变量是PATH,在Unix中PATH是以冒号隔开的目录列表,其元素是可执行文件的搜索路径,当输入rm fred这样的命令时,系统会在目录列表中依次寻找 rm 命令;
  • Perl 会在需要的时候用PATH来检索可执行程序,启动之后该程序如果需要调用其他程序,也会使用PATH进行搜索;
  • Perl 中可以通过%ENV哈希取得,其中每个键都代表一个环境变量;
    • 程序开始运行时,%ENV会保留从父进程继承来的设定值,修改哈希值就能修改环境变量;
    • 修改后的环境变量可以被子进程继承;
    • 子进程会继承父进程的环境变量,当前工作目录,标准输入,标准输出,标准错误和其他的"小秘密"
  • 假如需要运行系统的 make 程序,并且想用私有目录作为查找make的首选位置,并且希望禁用(make和其他程序敏感的) IFS环境变量:
#!/usr/bin/perl
$ENV{
   'PATH'} = "home/rootneer/bin:$ENV{PATH}";
delete $ENV{
   'IFS'};
my $make_result = system 'make';

2.2 exec函数

截止目前为止,涉及到的system的相关操作都可以用于exec函数;

  • sytem 和 exec 的区别
    • system 会创建子进程,子进程在perl睡眠期间执行任务;
    • exec 使当前进程自己去执行任务,像是goto,而不是就地调用子程序;
  • 当我们需要利用perl为其他程序设置环境变量的时候,使用 exec 就可以提升效率:
    • 使用 exec 函数时,perl 不会等待 exec 结束才结束,一旦跳转至 exec,perl 进程就结束;
    • 使用 system 函数时,perl 会等待 system 调用的子程序结束,然后 perl 程序才能结束,浪费系统资源;
    • 一旦执行 exec 的程序,perl 便放手退出,因此 exec 之后的任何代码都无法运行,除非启动 exec 程序出错。
#!/usr/bin/perl
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值