(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, alarm和setitimer。其中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/