系统函数

== 最简单的系统调用
 system "date"; # Perl会将 date 命令传递给unix的shell并获取返回值和error信息等  
== 带有系统参数的系统调用  
system 'ls -l $HOME'   注意,这里使用了单引号,目的是暗示$HOME是系统的变量而不是PERL的变量  
== 系统函数调用时的交互  
由于perl的标准输入输出和error都会被继承,因此调用系统函数和直接在shell中执行是一样的,对用户是透明的。perl会完成交互操作的传递。  
== 如何启动后台运行  
system "long_running_command with parameter &";   注意最后的&符号就是表示后台运行。

exec函数

exec和system非常相似,两者都用于从perl中启动进程访问shell。   
差别是:exec一旦启动进程用于执行shell,则本身就不复存在了。因此exec后面如果有其他代码就将不会被执行到(除非exec执行失败)。   
所以system执行shell更像函数调用,其本身仍然存在。而exec就好比goto语句,本身不复存在。

环境变量

== 获得环境变量    
%ENV hash表是PERL获得环境变量的方法。     每个key都是一个环境变量。    
== 环境变量来自何处    
来自父进程,对PERL 而言,一般就是指启动perl的shell。    
== 子进程的环境变量    
Perl启动的进程将会继承PERL设置的环境变量。    
== 在perl中修改环境变量    
还是举例说明吧。    
$ENV{'PATH'} = "/home/rootbeer/bin:$ENV{'PATH'}";  # 修改环境变量    
delete $ENV{'IFS'};  # 删除环境变量    
my $result = system "make";  # make 命令的进程将会继承上述修改后的环境变量

用反引号``抓取输出

== 反引号抓输出     
有时候系统进程的执行输出也为我们所需,如何获取输出内容呢?
方法就是使用``符号。
看例子     
my $now = `date`;     
print "Now time is $now";     
== 反引号不能交互     
但是用反引号有个缺点,就是不能从标准输入中读取内容。所以要注意。     
== 反引号在list环境中的运用     
my $who_text = `who`;  # 返回的多个在线用户及其信息在一行中输入     
my @who_lines = `who`;  # 返回的多个在线用户及其信息按照原始输出的样子分成多行进入array

并行进程——将进程当作file handles

== 并行进程      
用system和exec都是使用的同步进程方式,也就是perl启动一个进程,然后perl等待他完成,获得返回值,然后perl才能继续执行。
但是实际上,我们可以使用并行进程。也就是perl进程本身和该进程同时运行。      
并行进程的好处是,产生的结果实时获取,看起来比较真实,和实际shell执行比较吻合,而同步进程则必须等待子进程全部执行完毕,才返回结果。
采用下面的结构就可以实时获取输出并实时处理。      
open FH, "...command...";      
while (<FH>) {         ... processing...       }      
== 并行进程(作为perl的输入进程)      
open DATE, "date|" or die "can not pipe from date: $!";      
my $now = <DATE>;      
上面的例子将进程作为file handle,并通过这个file handle来获得数据。      
为了从这个file handle 获得数据。我们必须在程序名称右侧添加"|"符号,表示perl程序将通过该进程的pipe输出来获得数据。      
== 并行进程(作为perl的输出进程)      
open MAIL, "|mail merlyn" or die "Can not pipe to mail: $!";      
print MAIL, "The time is: $now";      
上面的例子将进程作为file handle,并向这个file handle输入数据。      
为了向这个file handle 输入数据。
我们必须在程序名称坐侧添加"|"符号,表示perl程序将通过该进程的pipe向其输入数据。
对于mail程序来说,这个file handle就是其标准输入。      
== 并行进程的关闭      
close MAIL;       die "mail: nonzero exit of $?" if $?;      
对于接收输入型进程来说。close命令就意味着发出一个EOF。       $?是进程的退出状态。
一般,0表示成功。非零表示失败。      

看看进程调用的底层实现

== system "date"; 的底层实现      
defined(my $pid = fork) or die "cannot fork: $!";      
unless ($pid) {         # 子进程从这儿开始        
 exec "date";        
 die "can not exec date: $!";      
}      
# 父进程在此      
waitpid ($pid, 0);

收发信号

== 信号的样子       
不同的信号用不同的名字标识(比如SIGINT表示一个中断信号),并且每个信号对应一个整数,整数的范围和具体的unit系统有关。       
== 信号的来源       
信号在某些重要事件发生时被发送。
比如按下Ctrl+C,就传递一个中断SIGINT到所有和当前的terminal相关的进程。       
== 主动发送信号       
Perl可以给其他进程主动发送信号。
比如要发送SIGINT到进程4201,就可以这样写       
kill 2, 4201 or die "Cannot signal 4201 with SIGINT: $!";       
发送信号的命令被命名为 kill ,因为信号的主要目的是终止一个进程。       
== kill进程操作的返回值       
如果进程别消灭,则返回 false 。
表示已经不存在。所以可以用下面代码检查kill的结果。       
unless (kell 0, $pid) {          warn "process $pid has gone away!"        }       
== 如何接收信号并响应       
看一个例子。       
sub my_int_handler {    
 # (中断)信号处理程序         
&clean_up;         
die "interrupted, exiting...\n";       }      
$SIG{'INT'} = 'my_int_handler';  # 指定SIGINT信号的处理程序为 my_int_handler      
.      
. # 程序运行中      
. # 这时有人按下了Ctrl+C,向本进程传来 SIGINT信号       .      
# 正常执行的结尾处      
&clean_up;       注意名为%SIG的hash表储存了一个信号处理mapping表。key是各类信号,value是相关处理子程序。       
== Perl收到信号如何响应       
Perl会停止当前的执行,然后跳到信号处理程序处,完成后再返回原来的位置。

perl学习之进程管理的更多相关文章

  1. Linux学习之进程管理(十九)

    Linux学习之进程管理 进程查看 查看系统中所有进程,使用BSD操作系统的格式 语法:ps aux 选项: a:显示所有前台进程 x:显示所有后台进程 u:显示这个进程是由哪个用户产生的 语法:ps ...

  2. Linux学习之进程管理

    |-进程管理     进程常用命令        |- w查看当前系统信息        |- ps进程查看命令        |- kill终止进程        |- 一个存放内存中的特殊目录/p ...

  3. Linux系统学习之进程管理

    什么是进程? 进程表示程序的一次执行过程,它是应用程序的运行实例,是一个动态的过程.或者可以更简单地描述为:进程是操作系统当前运行的程序.当一个进程开始运行时,就要启动了这个过程.进程包括动态的执行的 ...

  4. linux内核学习之进程管理------task_struct结构体

    struct task_struct { volatile long state;    /* -1 unrunnable, 0 runnable, >0 stopped */ struct t ...

  5. Linux内核学习笔记-2.进程管理

    原创文章,转载请注明:Linux内核学习笔记-2.进程管理) By Lucio.Yang 部分内容来自:Linux Kernel Development(Third Edition),Robert L ...

  6. Linux第六周学习总结——进程额管理和进程的创建

    Linux第六周学习总结--进程额管理和进程的创建 作者:刘浩晨 [原创作品转载请注明出处] <Linux内核分析>MOOC课程http://mooc.study.163.com/cour ...

  7. Linux学习笔记(六) 进程管理

    1.进程基础 当输入一个命令时,shell 会同时启动一个进程,这种任务与进程分离的方式是 Linux 系统上重要的概念 每个执行的任务都称为进程,在每个进程启动时,系统都会给它指定一个唯一的 ID, ...

  8. Linux快速入门教程-进程管理ipcs命令学习

    使用Linux系统必备的技能之一就是Linux进程管理,系统运行的过程正是无数进程在运行的过程.这些进程的运行需要占用系统的内存等资源,做好系统进程的管理,对于我们合理分配.使用系统资源有非常大的意义 ...

  9. Linux学习笔记(5)-进程管理

    进程简介 进程是正在执行的一个程序或命令,每一个进程都有自己的地址空间,并占有一定的系统资源.感性的认识,进程就是一个正在运行的程序 进程管理的作用 判断服务器的运行状态 查看系统中有哪些进程 杀死进 ...

随机推荐

  1. hdu 1695 GCD(容斥)

    题目链接 #include <bits/stdc++.h> using namespace std; typedef long long ll; inline int read() { , ...

  2. python操作rabbitmq实现广播效果

    生产方(Fanout_Publisher.py) # __author__ = 'STEVEN' import pika #开启socket connection = pika.BlockingCon ...

  3. morphia(3)-查询

    1.查询所有 @Test public void query() throws Exception { final Query<Employee> query = datastore.cr ...

  4. 转 PHP 正则表达式 以及案例

    2.Perl兼容的语法扩充 Perl兼容的正则表达式的模式类似于Perl中的语法,表达式必须包含在定界符中,除数字.字母.反斜线外的任何字符都可以作为定界符.例如,表达式’/^(?i)php[34]/ ...

  5. ViewPager的使用总结

    这两天公司项目一直需要用到ViewPager来显示各式各样的Banner图,因而再次做了一些总结,不全后续应该还会更新的. 1.ViewPager要想做到一个界面显示多个items 有两种方式 ,一种 ...

  6. Javaoo学习数组

  7. oracle 直接连接到数据库 CMD窗口

    打开cmd 在命令行 中输入如下命令  sqlplus sys/zd****!@60.**.203/orcl as sysdba  就直接连上了

  8. 死磕 java并发包之AtomicStampedReference源码分析(ABA问题详解)

    问题 (1)什么是ABA? (2)ABA的危害? (3)ABA的解决方法? (4)AtomicStampedReference是什么? (5)AtomicStampedReference是怎么解决AB ...

  9. ios has denied the launch request.

    ios has denied the launch request. You can choose either of the two ways. Solution 1: Open System Pr ...

  10. IOS生成UUID

    /** * 生成GUID */ + (NSString *)generateUuidString{ // create a new UUID which you own CFUUIDRef uuid ...