2013년 9월 11일 수요일

Perl 제대로배우기 - 14장(Process Management)

14. Process Management
system과 exec 사용하기
새로운 프로세스 가장 간단한 방법 : system 함수 사용
예) system(“date”);
system의 리턴형은 0 이면 정상 0 이 아니면 비정상 종료를 의미 한다. 그 이유는 쉘명령 결과 값을 리턴하기 때문이다.
** 자식 프로세스는 부모로 부터 현재 umask,현재 디렉토리,사용자ID
%ENV를 사용하여 환경 변수를 읽거나 변경할수 있다.
foreach $key(sort keys %ENV){
  print “$key = $ENV{$key}\n”;
}


local 연산자 이용하여 임시적으로 환경 변수를 변경하기
{
 local $ENV{“PATH”} = “/bin:/usr/bin:/usr/ucb”;
 system “grep fred bedrock >output”;
}
@cfiles = (“fred.c”,”barney.c”);
@options = (“-DHARD”,”-DGRANTE”);
system “gcc -o slate @options @cfiles”;
system “gcc”,”-o”,”slate”,@options,@cfiles;


역인용부호의 사용
backquote 사용하는 방법
완료를 기다리며, 표준 출력을 사용한다.
$now = “the time is now”.`date`;


foreach $_ (`who`){
  ($who,$where,$when) = /(\S+)\s+(\S+)\s+(.*)/;
  print “$who on $where at $when\n”;
}
2>&1  :  표준에러를 표준출력으로 합친다.
die “rm who_out*” if `rm who_out* 2>&1`;


파일핸들로서 프로세스 사용하기
C라이브러 popen(3) 처럼 파일핸들을 사용하여 프로세스를 생성하기
open(WHO,”who|”);
open(LPR,”|lpr -Pslatewriter”);
while(<WHO>){
  unless (/fred/){
     print LPR $_;
  }
}
close WHO;
close LPR:


fork 사용하기
fork 함수를 사용함.
if(!defined($child_pid = fork())){
 die “can’t fork : $!”;
} elsif ($child_pid){
 print “부모";
} else {
 print “자식";
}
프로세스 연산의 요약
시그널을 보내고 받기

댓글 없음: