zoukankan      html  css  js  c++  java
  • perl学习之进程管理

    系统函数

    == 最简单的系统调用
     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... ";       }      
    $SIG{'INT'} = 'my_int_handler';  # 指定SIGINT信号的处理程序为 my_int_handler      
    .      
    . # 程序运行中      
    . # 这时有人按下了Ctrl+C,向本进程传来 SIGINT信号       .      
    # 正常执行的结尾处      
    &clean_up;       注意名为%SIG的hash表储存了一个信号处理mapping表。key是各类信号,value是相关处理子程序。       
    == Perl收到信号如何响应       
    Perl会停止当前的执行,然后跳到信号处理程序处,完成后再返回原来的位置。
  • 相关阅读:
    Kubelet 会做些什么
    k8s apiserver 源码阅读笔记
    robotframework环境安装
    Hper-V卸载
    Hyper-V安装虚拟机
    git下载/上传文件提示:git did not exit cleanly
    jmeter使用csv传参进行并发测试验证
    jenkins启动
    win7系统中 python2、python3安装后再安装插件时遇到的问题
    Base.py最基层的一些方法的封装--自己整理的一些小内容
  • 原文地址:https://www.cnblogs.com/chip/p/4199595.html
Copyright © 2011-2022 走看看