系统函数

== 最简单的系统调用
 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. SpringBoot | 查看默认版本配置

    <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot ...

  2. Codeforces 1132D(二分模拟)

    要点 二分显然,关键在于怎么判断 题解方法:开k个队列代表每个时间有哪些电脑会挂掉,这部分O(n)预处理一下,之后扫一遍时间,每个时间点贪心选取最靠前的会挂的电脑未雨绸缪给它充电,然后看看充电以后要不 ...

  3. Codeforces Round #397 by Kaspersky Lab and Barcelona Bootcamp (Div. 1 + Div. 2 combined) C

    Misha and Vanya have played several table tennis sets. Each set consists of several serves, each ser ...

  4. bzoj 4695: 最假女选手 && Gorgeous Sequence HDU - 5306 && (bzoj5312 冒险 || 小B的序列) && bzoj4355: Play with sequence

    算导: 核算法 给每种操作一个摊还代价(是手工定义的),给数据结构中某些东西一个“信用”值(不是手动定义的,是被动产生的),摊还代价等于实际代价+信用变化量. 当实际代价小于摊还代价时,增加等于差额的 ...

  5. c/c++学习系列之取整函数,数据宽度与对齐

    浮点数的取整 C/C++取整函数ceil(),floor() double floor(double x); double ceil(double x); 使用floor函数.floor(x)返回的是 ...

  6. G. Of Zorcs and Axes 二分 + 贪心 —— STL的用法

    http://codeforces.com/gym/101149/problem/G 一开始还以为要用二分图去做,但是复杂度也太高了,O(n * m)的话直接爆炸. 考虑贪心,考虑第i个东西优先选一个 ...

  7. Unity Shader入门精要学习笔记 - 第3章 Unity Shader 基础

    来源作者:candycat   http://blog.csdn.net/candycat1992/article/ 概述 总体来说,在Unity中我们需要配合使用材质和Unity Shader才能达 ...

  8. 我的NopCommerce之旅(3): 系统代码结构分析

    一.概述 基于MVC 二.详细描述 \Libraries\Nop.Core 核心类,包括缓存.事件.帮助类.业务对象(订单.客户实体) \Libraries\Nop.Data 数据访问层,采用Enti ...

  9. 09通过winfrom实现简单的播放音、视频

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  10. phpmyadmin 出现Table 'root.pma_table_uiprefs' doesn't exist

    原文链接:http://zhidao.baidu.com/link?url=ugBKDds94yxWhh_IZ6rZWZYSd2nO555EZ1WMClXRrqL0aKLc-HPDrZVSKZyDaD ...