perl的进程、管道和信号

(1)    进程

进程是当前操作系统下一个被加载到内存的、正在运行的应用程序的实例。PERL中提供了灵活的进程参数,其中比较常用的是复制进程的方法:

fork函数:该函数不需要传入参数,当本进程为父进程时返回值为子进程的PID值,当进程为子进程时返回值为0。通过fork创建的子进程会共享父进程的所有变量、句柄等当前值。与之对应,在子进程中,如果想要获得父进程PID值,可以使用函数getppid函数。

exec函数:作用是以指定的SHELL语句代替原进程,参数为SHELL语句,成功调用后返回值为undef,其他返回值均为失败。使用此函数后生成的新进程与原进程为同一进程,有相同的PID,共享变量语柄等一切当前值。与之功能相近的system函数,作用是直接生成子进程,参数为SHELL语句,当函数能正常调用时返回值为0,其他返回值均为错误。

(2)    管道

管道是为了使不同进程之间可以进行通信的制定的,是UNIX下程序开发的重要手段。PERL中对管道的使用提供了更加的支持,相关的重要函数包括:

open:作用是打开句柄,格式为open(FILEHANDLE,"符号+参数")FILEHANDLE(句柄)包括很多成分,如文件句柄、SOCKET句柄、管道句柄,本文只谈到管道句柄。第二个参数为双引号或单引号括着的管道符号与参数。管道符号为"|",把管道符号放到参数 的左边为‘只写’,放到右边为‘只读’,如果两边都有便为双向管道,既可读也可写。

pipe:作用是创建管道对,格式为pipe(READ,WRITE)。正常调用后返回值为非零数,第一个参数为被创建的读管道,第二个参数为被创建的写管道。此函数通常配合进程中     fork函数一同使用,步骤是先使用pipe函数建立管道对,再使用fork()创建新进程,在不同的进程关闭不同的管道,这样就可以达到管道间通信的目的了。

close:作用是关闭管道,格式为close(AAA)close在调用时能将子程序的终止代码放到特殊变量$?中;当关闭的是写管道时,close调用将进入堵塞状态直至另一端完成它的全部工作为止。

(3)    信号

信号是UNIX的软件中断,用于通知进程发生了重要事件需要处理,这为监视与控制其他进程提供了必要的条件。通过下表对通用信号做一下归纳:

信号名

标注

解释

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输出

上表中的第三列‘标注’定义了当进程接受到信号后的操作,例如:

        A-----终止进程

        B-----忽略进程信号

        C-----终止进程并卸下内核

        D-----停止进程

        E-----恢复进程

        F-----不能截取或忽略进程信号

信号事件的发生有两个来源:一个是硬件的原因(比如我们按下了键盘),一个是软件的原因(比如我们使用系统函数或是命令发出信号). 最常用的四个发出信号的系统函数是kill, raise, alarmsetitimer。其中kill系统调用负责向进程发送sig信号,raise系统调用向自己发送一个sig信号,alarm函数和时间相关,能够在指定时间后向自己发送一个SIGALRM信号。有时候我们希望进程正确的执行,而不想进程受到信号的影响,这个时候我们就要进行信号的操作了。信号操作最常用的方法是信号屏蔽,信号屏蔽要用到下面的几个函数:

sigemptyset(sigset_t *set)

初始化信号集合set,set配置为空。

sigfillset(sigset_t *set)

初始化信号集合,将信号集合配置为任何信号的集合。

sigaddset(sigset_t *set,int signo)

将信号signo加入到信号集合之中。

sigdelset(sigset_t *set,int signo)

将信号从信号集合中删除。

sigismember(sigset_t *set,int signo)

查询信号是否在信号集合之中。

sigprocmask(int how,const sigset_t *set,sigset_t *oset)

最为关键的一个函数.在使用之前要先配置好信号集合set。该函数的作用是将指定的信号集合set加入到进程的信号阻塞集合之中去,假如提供oset那么当前的进程信号阻塞集合将会保存在oset里面。参数how决定函数的操作方式:

SIG_BLOCK:增加一个信号集合到当前进程的阻塞集合之中。

SIG_UNBLOCK:从当前的阻塞集合之中删除一个信号集合。

SIG_SETMASK:将当前的信号集合配置为信号阻塞集合。

 

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/73573/viewspace-571487/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/73573/viewspace-571487/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值