프로세스와 IPC
1. signal
시스템에서 지원하는 시그널 목록은 "signal hash" %SIG의 key를 보면 알 수 있다. Config 모듈을 쓸 경우, %Config 해쉬에 시스템 정보가 들어가며, 시그널 이름들은 $Config{sig_name}에, 번호는 $Config{sig_num}에 들어 있다.
%SIG의 value는 다음 중 하나
- IGNORE
- DEFAULT
- 시그널 핸들러 서브루틴의 레퍼런스
주의: 시그널 핸들링 중에 다시 시그널을 받을 수 있다. 핸들러는 오래 수행되거나 시스템 명령을 사용하는 것을 피할 것
UNIX System V의 경우는 시그널 핸들러가 한 번 사용되면 해당 시그널은 디폴트 핸들러로 복귀하기 때문에 매번 다시 핸들러를 지정해야 한다. (실제 어떤 시스템에서 프로그램이 사용될 지 모르므로 이걸 가정하는 것이 안전)
SIGALRM 처리 예제
#!/usr/bin/perl
use warnings;
use strict;
$SIG{ALRM} = sub { die "SIGALRM received" };
eval {
alarm 30;
my $input = <STDIN>;
alarm 0;
};
if ($@) {
if ($@ =~ /SIGALRM/) {
print "Operation timed out.\n";
} else {
die "Something unexpected occurred; $@\n";
}
}
2. fork, wait, exec
C에서와 유사하게...
fork
- parent 프로세스에는 child의 pid반환
- child 프로세스에는 0 반환
- 실패하면 undef 반환
wait
- child 프로세스가 종료될 때 parent에게 CHLD 시그널을 보냄
- CHLD시그널 핸들링 예
$SIG{CHLD} = \&reaper;
sub reaper {
my $child = wait;
print "Process $child has exited cleanly.\n";
$SIG{CHLD} = \&reaper;
}
- 종료된 자식 프로세스의 PID 반환, 자식이 없는 경우 -1 반환
- 종료 상태 코드는 $?에 저장됨
3. 기타 & comments
컴퓨터분류