문제

상상해 다음과 같은 펄 코드(여기서 의사 코드):

successfully acquired flock for FILEHANDLER       # line 1
some error or maybe simply a call to exit()       # line 2
close FILEHANDLER (which also releases the lock)  # line 3

이 경우에 없을 잠금을 해제로는 Perl 스크립트 끝에 선 2.이 경우에는 잠금 해제하여 운영 체제?그것은"참조 헤이,스크립트는 잠금을 얻으로 추락한"잠금을 해제하?그것은 잠금을 해제하십니까?또한,거기에 하나 펄스 실행에 대한 각 스크립트,그래서는 그는 스크립트를 추락/중지 잠금을 해제하지 않고?

도움이 되었습니까?

해결책

이 경우에는 잠금 해제하여 운영 체제?
그것은"참조 헤이,스크립트는 잠금을 얻으로 추락한"잠금을 해제하?
그것은 잠금을 해제하십니까?

이러한 모든 질문은 시스템에 따라 달라집니다.Perl5 지 않을 구현하는 파일 잠금 기능,그것은 단지에 대한 공통 인터페이스를 제공합 flock(2), fcntl(2) 잠금,또는 lockf(3) (에 따라에서 가능한 것이 무엇인지 OS).또한 있을 수 있습니다 사이에 차이가 무엇 때 일어나는 프로그램을 종료 segfaults,또는 사망으로 sigkill.

빠른 테스트에서 리눅스는 잠금을 제거에서 정상적인 종료를 조건:

$ perl -le 'open my $fh, ">", "f" or die $!; print flock($fh, 6) ? "got lock" : "was already locked", "\n"'
got lock
$ perl -le 'open my $fh, ">", "f" or die $!; print flock($fh, 6) ? "got lock" : "was already locked", "\n"'
got lock

어떤 일이 발생하는지 살펴보겠 경우리 die:

$ perl -le 'open my $fh, ">", "f" or die $!; print flock($fh, 6) ? "got lock" : "was already locked", "\n"; die "died"'
got lock
died at -e line 1.
$ perl -le 'open my $fh, ">", "f" or die $!; print flock($fh, 6) ? "got lock" : "was already locked", "\n"; die "died"'
got lock
died at -e line 1.

을 얻을 세그멘테이션,우리가 필요합니다에 액세스하는데 사용 Inline 그것을 얻을:

$ cat segfault.pl
#!/usr/bin/perl

use strict;
use warnings;

use Inline "C";

open my $fh, ">", "f" or die $!;

print flock($fh, 6) ? "got lock" : "was already locked", "\n";

crash();

__DATA__
__C__

void crash() {
    int* ptr = NULL;
    *ptr = 5;
}
$ perl segfault.pl
got lock
Segmentation fault
$ perl segfault.pl
got lock
Segmentation fault

그리고 마지막으로,여기에 무엇이 일어나는 프로그램을 사용할 때 발송 SIGKILL:

$ cat fork.pl
#!/usr/bin/perl

use strict;
use warnings;

$SIG{CHLD} = "IGNORE"; #auto-reap children

die "could not fork: $!" unless defined(my $pid = fork);
unless ($pid) {
    #child
    open my $fh, ">", "f" or die $!;
    print flock($fh, 6) ? "got lock" : "was already locked", "\n";
    sleep(100);
    exit;
}

kill 9, $pid;

die "could not fork: $!" unless defined($pid = fork);
unless ($pid) {
    #child
    open my $fh, ">", "f" or die $!;
    print flock($fh, 6) ? "got lock" : "was already locked", "\n";
    exit;
}
$ perl fork.pl
got lock
got lock

이러한 실험에서,우리가 볼 수 있는 잠금이 해제되기 리눅스에서 각각의 경우에 당신이 우려하고 있었다.

또한,거기에 하나 펄스 실행에 대한 각 스크립트,그래서는 그는 스크립트를 추락/중지 잠금을 해제하지 않고?

Yes,Perl5 는 중 perl 과정별 스크립트입니다.는 경우에도 당신은 포크,아이 자신을 가져옵니다 perl 과정입니다.실을 꿰는 제공하지 않는 별도의 perl 과정입니다.

참고:면 부모 프로세스가 잠금 및을 제공하지 않습기 전에 잠금,그 아이가 동일한 경우에도 잠금 부모가 종료됩니다.

다른 팁

프로그램이 종료되면 OS는 프로그램에서 획득 한 모든 잠금을 자동으로 해제하고 프로그램이 열린 모든 파일을 닫습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top