• 27-Perl 进程管理


    1.Perl 进程管理
    Perl 中你可以以不同的方法来创建进程。
    本教程将讨论一些进程的管理方法。
    你可以使用特殊变量 $$ 或 $PROCESS_ID 来获取进程 ID。
    %ENV 哈希存放了父进程,也就是shell中的环境变量,在Perl中可以修改这些变量。
    exit() 通常用于退出子进程,主进程在子进程全部退出后再退出。
    所有打开的句柄会在子程序中被 dup() 函数复制, 所有关闭进程所有句柄不会影响其他进程 。

    2.反引号运算符
    使用反引号运算符可以很容易的执行 Unix 命令。你可以在反引号中插入一些简单的命令。命令执行后将返回结果:
    #!/usr/bin/perl
    @files = `ls -l`;
    foreach $file (@files){
    print $file;
    }
    1;

    3.system() 函数
    你也可以使用 system() 函数执行 Unix 命令, 执行该命令将直接输出结果。
    默认情况下会送到目前Perl的STDOUT指向的地方,一般是屏幕。
    你也可以使用重定向运算符 > 输出到指定文件:
    你需要注意命令包含环境变量如 $PATH 或 $HOME 的输出结果,如下所示:
    #!/usr/bin/perl
    $PATH = "我是 Perl 的变量";
    system('echo $PATH'); # $PATH 作为 shell 环境变量
    system("echo $PATH"); # $PATH 作为 Perl 的变量
    system("echo $PATH"); # 转义 $
    1;

    4.fork() 函数
    Perl fork() 函数用于创建一个新进程。
    在父进程中返回子进程的PID,在子进程中返回0。如果发生错误(比如,内存不足)返回undef,并将$!设为对应的错误信息。
    fork 可以和 exec 配合使用。exec 函数执行完引号中的命令后进程即结束。
    #!/usr/bin/perl
    if(!defined($pid = fork())) {
    # fork 发生错误返回 undef
    die "无法创建子进程: $!";
    }elsif ($pid == 0) {
    print "通过子进程输出 ";
    exec("date") || die "无法输出日期: $!";
    } else {
    # 在父进程中
    print "通过父进程输出 ";
    $ret = waitpid($pid, 0);
    print "完成的进程ID: $ret ";
    }
    1;
    如果进程退出时,会向父进程发送一个CHLD的信号后,就会变成僵死的进程,需要父进程使用wait和waitpid来终止。当然,也可以设置$SIG{CHLD}为IGNORG:
    #!/usr/bin/perl
    local $SIG{CHLD} = "IGNORE";
    if(!defined($pid = fork())) {
    # fork 发生错误返回 undef
    die "无法创建子进程: $!";
    }elsif ($pid == 0) {
    print "通过子进程输出 ";
    exec("date") || die "无法输出日期: $!";
    } else {
    # 在父进程中
    print "通过父进程输出 ";
    $ret = waitpid($pid, 0);
    print "完成的进程ID: $ret ";
    }
    1;

    5.Kill 函数
    Perl kill('signal', (Process List))给一组进程发送信号。signal是发送的数字信号,9为杀掉进程。
    首先看看linux中的常用信号,见如下列表:
    信号名 值 标注 解释
    HUP 1 A 检测到挂起
    INT 2 A 来自键盘的中断
    QUIT 3 A 来自键盘的停止
    ILL 4 A 非法指令
    ABRT 6 C 失败
    FPE 8 C 浮点异常
    KILL 9 AF 终端信号
    USR1 10 A 用户定义的信号1
    SEGV 11 C 非法内存访问
    USR2 12 A 用户定义的信号2
    PIPE 13 A 写往没有读取者的管道
    ALRM 14 A 来自闹钟的定时器信号
    TERM 15 A 终端信号
    CHLD 17 B 子进程终止
    CONT 18 E 如果被停止则继续
    STOP 19 DF 停止进程
    TSTP 20 D tty键入的停止命令
    TTIN 21 D 对后台进程的tty输入
    TTOU 22 D 对后台进程的tty输出

    以下实例向进程 104 和 102 发送 SIGINT 信号:
    #!/usr/bin/perl
    kill('INT', 104, 102);
    1;

  • 相关阅读:
    代码中的TODO FIXME XXX 等注释释义
    [转]Linux环境下段错误的产生原因及调试方法小结
    linux 的date命令及系统时间设置
    声明和定义
    [转]关于fork的一个面试题
    [转]头文件定义全局变量等问题
    jQuery帮助之CSS尺寸(五)outerHeight、outerWidth
    ActiveX
    10个免费的javascript富文本编辑器(jQuery and nonjQuery)
    <推荐>65个以自然风光为背景的UI设计
  • 原文地址:https://www.cnblogs.com/BradMiller/p/11860952.html
Copyright © 2020-2023  润新知