Latest web development tutorials

펄 프로세스 관리

이 프로세스를 만드는 다른 방법으로 할 수있는 펄.

이 튜토리얼은 일부 프로세스의 관리를 설명합니다.

  • 당신은 프로세스 ID를 얻기 위해 특수 변수$ $ 또는 $ PROCESS_ID를사용할 수 있습니다.

  • %의 ENV 해시는 펄에서 쉘 환경 변수가 이러한 변수를 수정할 수있는 부모 프로세스를 보유하고있다.

  • 출구 ()는 통상 자식 프로세스를 종료하는 데 사용되는 자식 프로세스는 메인 프로세스가 모두 종료 한 후에 종료한다.

  • 열려있는 모든 핸들은 모든 모든 프로세스가 다른 프로세스에 영향을 미치지 않습니다 처리 닫 복사 서브 루틴 () 함수에서 DUP 있습니다.


역 따옴표 연산자

역 인용 부호 연산자를 사용하면 쉽게 유닉스 명령을 실행할 수 있습니다. 당신은 반 따옴표로 간단한 명령을 삽입 할 수 있습니다. 명령 실행 결과를 반환합니다 :

#!/usr/bin/perl

@files = `ls -l`;

foreach $file (@files){
   print $file;
}

1;

다음으로 상기 프로그램의 출력 결과는 :

drwxr-xr-x 3 root root 4096 Sep 14 06:46 9-14
drwxr-xr-x 4 root root 4096 Sep 13 07:54 android
-rw-r--r-- 1 root root  574 Sep 17 15:16 index.htm
drwxr-xr-x 3  544  401 4096 Jul  6 16:49 MIME-Lite-3.01
-rw-r--r-- 1 root root   71 Sep 17 15:16 test.pl
……

시스템 () 함수

또한 명령을 직접 실행 출력시스템 () 함수 UNIX 명령을 수행 할 수 있습니다.기본적으로 현재는 일반적으로 화면, 펄의 STDOUT 포인트로 전송됩니다. 또한 지정된 파일로 재 지정 연산자> 출력을 사용할 수 있습니다 :

다음으로 상기 프로그램의 출력 결과는 :

drwxr-xr-x 3 root root 4096 Sep 14 06:46 9-14
drwxr-xr-x 4 root root 4096 Sep 13 07:54 android
-rw-r--r-- 1 root root  574 Sep 17 15:16 index.htm
drwxr-xr-x 3  544  401 4096 Jul  6 16:49 MIME-Lite-3.01
-rw-r--r-- 1 root root   71 Sep 17 15:16 test.pl
……

다음과 같이 명령하면, 같은 출력 또는 $ HOME에 $의 PATH와 같은 환경 변수를 포함해야합니다 :

#!/usr/bin/perl

$PATH = "我是 Perl 的变量";

system('echo $PATH');  # $PATH 作为 shell 环境变量
system("echo $PATH");  # $PATH 作为 Perl 的变量
system("echo \$PATH"); # 转义 $

1;

다음으로 상기 프로그램의 출력 결과는 :

/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin
我是 Perl 的变量
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin

포크 () 함수

펄 포크 () 함수는 새로운 프로세스를 만드는 데 사용됩니다.

자식 프로세스는 0을 반환에, 부모 프로세스의 PID의 아이를 돌려줍니다. 오류가 (예를 들어, 메모리 부족) 미확정 수익을 발생하고, $ 경우! 해당 오류 메시지로 설정됩니다.

이는 포크 간부와 함께 사용될 수있다. 인용 부호 내의 명령의 끝 후에 완료 간부 기능 실행 방법.

#!/usr/bin/perl

if(!defined($pid = fork())) {
   # fork 发生错误返回 undef
   die "无法创建子进程: $!";
}elsif ($pid == 0) {
   print "通过子进程输出\n";
   exec("date") || die "无法输出日期: $!";
  
} else {
   # 在父进程中
   print "通过父进程输出\n";
   $ret = waitpid($pid, 0);
   print "完成的进程ID: $ret\n";

}

1;

다음으로 상기 프로그램의 출력 결과는 :

通过父进程输出
通过子进程输出
2016年 6月19日 星期日 22时21分14秒 CST
完成的进程ID: 47117

프로세스 종료, 그것은 CHLD 후 부모 프로세스에 신호를 보내면, 그것은 부모 프로세스 대기 필요하고 종료 waitpid를 데드 처리 될 것이다. 물론, 당신은 또한 $ SIG {CHLD} IGNORG로 설정할 수 있습니다 :

#!/usr/bin/perl

local $SIG{CHLD} = "IGNORE";
 
if(!defined($pid = fork())) {
   # fork 发生错误返回 undef
   die "无法创建子进程: $!";
}elsif ($pid == 0) {
   print "通过子进程输出\n";
   exec("date") || die "无法输出日期: $!";
  
} else {
   # 在父进程中
   print "通过父进程输出\n";
   $ret = waitpid($pid, 0);
   print "完成的进程ID: $ret\n";

}

1;

다음으로 상기 프로그램의 출력 결과는 :

通过父进程输出
通过子进程输出
2016年 6月19日 星期日 22时30分56秒 CST
完成的进程ID: -1

연속 함수

펄 킬 ( '신호'( 프로세스 목록)) 프로세스 그룹에 신호를 보낸다.신호는 프로세스를 종료하는 9 전송 된 디지털 신호이다.

리눅스 일반적으로 사용되는 신호에 먼저보고 아래 목록을 참조하십시오

信号名          值          标注          解释
————————————————————————————————————————————————————————————
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输出

다음의 예는 SIGINT 신호를 보내 (104) 및 (102)을 처리합니다

#!/usr/bin/perl

kill('INT', 104, 102);
 
1;