#!/usr/bin/perl -w
chdir ‘/home/zhangjingjing’ or die “can’t chdir to /home/zhangjingjing directory:
!
"
;
e
x
e
c
′
l
s
′
,
′
−
l
′
o
r
d
i
e
"
c
a
n
′
t
e
x
e
c
l
s
:
!"; exec 'ls','-l' or die "can't exec ls:
!";exec′ls′,′−l′ordie"can′texecls:!”;
#第一行的程序代码会将当前工作目录切换到根目录,它的名称总是固定的
#第二行使用了多参数的exec函数来将结果传递到标准输出
#exec函数导致perl进程自己去执行任务,
例如:要运行/tmp目录下的bedrock命令并带上-o args以及程序本身所调用的参数:
chdir ‘/tmp’ or die “Cannot chdir /tmp:$!”;
exec ‘bedrock’, ‘-o’, ‘args1’, @ARGV;
#!/usr/bin/perl -w
open STDOUT,’>’,‘ls.out’ or die “can’t write to ls.outL
!
"
;
o
p
e
n
S
T
D
E
R
R
,
′
>
′
,
′
l
s
.
e
r
r
′
o
r
d
i
e
"
c
a
n
′
t
w
r
i
t
e
t
o
l
s
.
e
r
r
:
!"; open STDERR,'>','ls.err' or die "can't write to ls.err:
!";openSTDERR,′>′,′ls.err′ordie"can′twritetols.err:!”;
chdir ‘/home/zhangjingjing’ or die “can’t chdir to /home/zhangjingjing directory:
!
"
;
e
x
e
c
′
l
s
′
,
′
−
l
′
o
r
d
i
e
"
c
a
n
′
t
e
x
e
c
l
s
:
!"; exec 'ls','-l' or die "can't exec ls:
!";exec′ls′,′−l′ordie"can′texecls:!”;
#程序的前两行会重新打开STDOUT和STDERR并将它们重定向到当前工作目录下的两个文件里(在切换工作目录之前)
#在工作目录切换之后,将会执行显示目录清单里的命令,并把数据传送到之前打开的两个文件里
#!/usr/bin/perl -w
print date
;
if (date
=~/\AS/){
print “go play!\n”;
}else{
print “get to work!\n”;
}
#因为Saturday周六和Sunday周日都是以S开头,而且date命令的输出结果又是以“今天是星期几”作为开始
#所以只要检查date命令的输出,看看它是否以S开头就可以了
#可以将模式换成/\A(Sat|Sun)/
\A: 匹配字符串的绝对开头
#!/usr/bin/perl -w
use 5.010;
sub my_hup_handler {state
n
;
s
a
y
′
c
a
u
g
h
t
H
U
P
:
′
,
+
+
n; say 'caught HUP:',++
n;say′caughtHUP:′,++n}
sub my_usr1_handler {state
n
;
s
a
y
′
c
a
u
g
h
t
U
S
R
1
:
′
,
+
+
n; say 'caught USR1:',++
n;say′caughtUSR1:′,++n}
sub my_usr2_handler {state
n
;
s
a
y
′
c
a
u
g
h
t
U
S
R
2
:
′
,
+
+
n; say 'caught USR2:',++
n;say′caughtUSR2:′,++n}
sub my_usr2_handler {say ‘caught INT.Exiting.’;exit}
say " I am $$";
foreach my $signal (qw(int hup usr1 usr2)){
$SIG{uc KaTeX parse error: Expected 'EOF', got '}' at position 7: signal}̲="my_{signal}_handler";
}
while(1){sleep 1};
#我们需要另外打开一个终端会话来运行程序以发送信号
$ kill -HUP 61203
$perl -e ‘kill HUP => 61203’
$perl -e ‘kill USR2 => 61203’
#该程序的输出显示每次信号来到时我们已经见过的次数:
KaTeX parse error: Expected 'EOF', got '#' at position 144: …t INT.Exiting. #̲让它能捕获信号并报告之前收到该…kill -USR1 12345
#要捕获某些信号,就要设置信号处理句柄,做一些重复性的工作,对每个信号处理句柄子程序,都设置一个state变量
#这样每次调用子程序时都可以访问之前累计的数字
#用foreach循环一次将正确的子程序名称赋值给%SIG中的适当值
#最后创建一个无限循环,让程序一直运行着,准备接收信号