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...\n";       }

$SIG{‘INT‘} = ‘my_int_handler‘;  # 指定SIGINT信号的处理程序为 my_int_handler

.

. # 程序运行中

. # 这时有人按下了Ctrl+C,向本进程传来 SIGINT信号       .

# 正常执行的结尾处

&clean_up;       注意名为%SIG的hash表储存了一个信号处理mapping表。key是各类信号,value是相关处理子程序。       
== Perl收到信号如何响应

Perl会停止当前的执行,然后跳到信号处理程序处,完成后再返回原来的位置。

时间: 2024-12-10 14:30:16

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

Linux 程序设计学习笔记----进程管理与程序开发(下)

转载请注明出处:http://blog.csdn.net/suool/article/details/38419983,谢谢! 进程管理及其控制 创建进程 fork()函数 函数说明具体参见:http://pubs.opengroup.org/onlinepubs/009695399/functions/fork.html 返回值:Upon successful completion, fork() shall return 0 to the child process and shall re

linux内核学习:进程管理

进程状态 TASK_RUNNING 可运行或正在运行 TASK_INTERRUPTIBLE 进程被阻塞,但可以被信号唤醒 TASK_UNINTERRUPTIBLE 进程被阻塞,且不可以被信号唤醒 TASK_STOPPED 进程已停止,且不能再投入运行 TASK_ZOMBIE 所谓的僵死进程,进程描述符仍然保留 关键函数和结构 task_struct thread_info current clone fork exec wait exit linux内核学习:进程管理,布布扣,bubuko.co

Linux 程序设计学习笔记----进程管理与程序开发(上)

转载请注明出处,http://blog.csdn.net/suool/article/details/38406211,谢谢! Linux进程存储结构和进程结构 可执行文件结构 如下图: 可以看出,此ELF可执行文件存储时(没有调入内存)分为代码区.数据区和未出花数据区三部分. 代码区:存放cpu的执行的机器指令. 数据区:包含程序中的已经初始化的静态变量,以及已经初始化的全局变量. 未初始化数据区:存入的是未初始化的全局变量和未初始化的静态变量. 现在在上面的程序代码中增加一个int的静态变量

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

Linux学习之进程管理 进程查看 查看系统中所有进程,使用BSD操作系统的格式 语法:ps aux 选项: a:显示所有前台进程 x:显示所有后台进程 u:显示这个进程是由哪个用户产生的 语法:ps -le 查看系统中所有进程,使用Linux标准命令格式 选项 l:显示详细信息 e:显示所有进程 USER:该进程是由哪个用户产生的 PID:进程的ID号 %CPU:该进程占用CPU资源的百分比,占用越高,进程越消耗资源. %MEM:该进程占用物理内存的百分比,占用越高,进程越消耗资源. VSZ:

操作系统原理学习笔记--进程管理

标签: 数据结构primitive存储算法io作业 2012-09-01 16:50 6603人阅读 评论(1) 收藏 举报  分类: [OS](4)  版权声明:本文为博主原创文章,未经博主允许不得转载. 进程管理 要点: 基础:进程描述及控制 策略:进程调度 实现:互斥与同步 避免:死锁与饥饿 解决:几个经典问题 进程的引入 程序的顺序执行 源代码程序,目标程序和可执行程序 程序执行:编辑,编译,链接,执行 程序的结构:顺序,分支,循环结构 程序执行的特征:顺序性,封闭性,可再现性 程序并发

Linux学习之进程管理

|-进程管理     进程常用命令        |- w查看当前系统信息        |- ps进程查看命令        |- kill终止进程        |- 一个存放内存中的特殊目录/proc        |- 进程的优先级        |- 进程的挂起与恢复        |- 通过top命令查看进程        计划任务        |- 计划任务的重要性        |- 一次性计划at和batch        |- 周期性计划crontab    进程管理的概念

Professional Linux Kernel Architecture - 学习笔记.进程管理和调度

1.相关概念. 1.程序.进程.线程 程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序就称之为进程.程序和进程的区别就在于:程序是指令的集合,它是进程运行的静态描述文本:进程是程序的一次执行活动,属于动态概念.允许多个程序同时加载到内存中,在操作系统的调度下,可以实现并发地执行.这是这样的设计,进程的出现让每个用户感觉到自己独享CPU. 线程是进程的一个实体, 是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,

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

struct task_struct { volatile long state;    /* -1 unrunnable, 0 runnable, >0 stopped */ struct thread_info *thread_info; atomic_t usage; unsigned long flags;    /* per process flags, defined below */ unsigned long ptrace; int lock_depth;     /* Lock

操作系统学习---进程管理(二)

要点: 基础:进程描述及控制 策略:进程调度 实现:互斥与同步 避免:死锁与饥饿 解决:几个经典问题 进程的引入 程序的顺序执行 源代码程序,目标程序和可执行程序 程序执行:编辑,编译,链接,执行 程序的结构:顺序,分支,循环结构 程序执行的特征:顺序性,封闭性,可再现性 程序并发执行 多道程序设计技术:多个程序并发执行 程序并发执行时的特征:间断性,非封闭性,不可再现性 并发执行引发的问题: 协调各程序的执行顺序:输入数据还未全部输入内存时,计算必须等待 多个执行程序共享系统资源,程序之间可能