Perl-프로세스 관리
Perl을 다양한 방법으로 사용하여 요구 사항에 따라 새 프로세스를 만들 수 있습니다. 이 튜토리얼은 Perl 프로세스를 생성하고 관리하는 데 가장 중요하고 자주 사용되는 몇 가지 방법을 나열합니다.
특수 변수를 사용할 수 있습니다. $$ 또는 $PROCESS_ID 현재 프로세스 ID를 가져옵니다.
언급 된 방법 중 하나를 사용하여 생성 된 모든 프로세스는 자체 가상 환경을 유지합니다. %ENV 변하기 쉬운.
그만큼 exit() 함수는 항상이 함수를 실행하는 자식 프로세스 만 종료하고 실행중인 모든 자식 프로세스가 종료되지 않는 한 전체 메인 프로세스는 종료되지 않습니다.
열려있는 모든 핸들은 자식 프로세스에서 dup () 처리되므로 한 프로세스에서 핸들을 닫아도 다른 핸들에는 영향을주지 않습니다.
백 스틱 연산자
Unix 명령을 실행하는 가장 간단한 방법은 백 스틱 연산자를 사용하는 것입니다. 백 스틱 연산자 안에 명령을 입력하면 명령이 실행되고 다음과 같이 저장 될 수있는 결과가 반환됩니다.
#!/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
drwx------ 2 root root 4096 Sep 17 15:11 vAtrJdy
system () 함수
당신은 또한 사용할 수 있습니다 system()모든 Unix 명령을 실행하는 함수로, 출력은 perl 스크립트의 출력으로 이동합니다. 기본적으로 STDOUT과 같은 화면이지만 리디렉션 연산자> −를 사용하여 모든 파일로 리디렉션 할 수 있습니다.
#!/usr/bin/perl
system( "ls -l")
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
drwx------ 2 root root 4096 Sep 17 15:11 vAtrJdy
명령에 $ PATH 또는 $ HOME과 같은 쉘 환경 변수가 포함 된 경우주의하십시오. 다음 세 가지 시나리오를 시도하십시오-
#!/usr/bin/perl
$PATH = "I am Perl Variable";
system('echo $PATH'); # Treats $PATH as shell variable
system("echo $PATH"); # Treats $PATH as Perl variable
system("echo \$PATH"); # Escaping $ works.
1;
위의 코드를 실행하면 $ PATH 셸 변수에 설정된 내용에 따라 다음과 같은 결과가 생성됩니다.
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin
I am Perl Variable
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin
fork () 함수
Perl은 fork()같은 이름의 Unix 시스템 호출에 해당하는 함수. fork () 시스템 호출이 가능한 대부분의 유닉스 계열 플랫폼에서 Perl의 fork ()는 단순히 호출합니다. fork () 시스템 호출을 사용할 수없는 Windows와 같은 일부 플랫폼에서 Perl은 인터프리터 수준에서 fork ()를 에뮬레이트하도록 빌드 될 수 있습니다.
fork () 함수는 현재 프로세스를 복제하는 데 사용됩니다. 이 호출은 동일한 지점에서 동일한 프로그램을 실행하는 새 프로세스를 만듭니다. 자식 pid를 부모 프로세스로, 0을 자식 프로세스로, 포크가 실패하면 undef를 반환합니다.
당신이 사용할 수있는 exec() 요청 된 실행 파일을 시작하는 프로세스 내의 함수는 별도의 프로세스 영역에서 실행되며 exec ()는 해당 프로세스와 동일한 종료 상태로 종료하기 전에 완료 될 때까지 기다립니다.
#!/usr/bin/perl
if(!defined($pid = fork())) {
# fork returned undef, so unsuccessful
die "Cannot fork a child: $!";
} elsif ($pid == 0) {
print "Printed by child process\n";
exec("date") || die "can't exec date: $!";
} else {
# fork returned 0 nor undef
# so this branch is parent
print "Printed by parent process\n";
$ret = waitpid($pid, 0);
print "Completed process id: $ret\n";
}
1;
위의 코드가 실행되면 다음 결과가 생성됩니다.
Printed by parent process
Printed by child process
Tue Sep 17 15:41:08 CDT 2013
Completed process id: 17777
그만큼 wait() 과 waitpid()fork ()에 의해 반환 된 의사 프로세스 ID로 전달 될 수 있습니다. 이러한 호출은 의사 프로세스가 종료 될 때까지 적절히 대기하고 상태를 반환합니다. 자녀를 기다리지 않고 포크를 사용하면waitpid()기능, 당신은 좀비를 축적합니다. Unix 시스템에서는 다음과 같이 $ SIG {CHLD}를 "IGNORE"로 설정하여이를 방지 할 수 있습니다.
#!/usr/bin/perl
local $SIG{CHLD} = "IGNORE";
if(!defined($pid = fork())) {
# fork returned undef, so unsuccessful
die "Cannot fork a child: $!";
} elsif ($pid == 0) {
print "Printed by child process\n";
exec("date") || die "can't exec date: $!";
} else {
# fork returned 0 nor undef
# so this branch is parent
print "Printed by parent process\n";
$ret = waitpid($pid, 0);
print "Completed process id: $ret\n";
}
1;
위의 코드가 실행되면 다음 결과가 생성됩니다.
Printed by parent process
Printed by child process
Tue Sep 17 15:44:07 CDT 2013
Completed process id: -1
kill () 함수
Perl kill('KILL', (Process List)) 함수는 fork ()에서 반환 된 ID를 전달하여 의사 프로세스를 종료하는 데 사용할 수 있습니다.
의사 프로세스 ()에서 kill ( 'KILL', (Process List))를 사용하면 의사 프로세스를 구현하는 스레드가 리소스를 정리할 기회를 얻지 못하기 때문에 일반적으로 메모리 누수가 발생할 수 있습니다.
당신이 사용할 수있는 kill() 예를 들어 다음은 프로세스 ID 104 및 102에 SIGINT를 전송합니다.
#!/usr/bin/perl
kill('INT', 104, 102);
1;