현재 위치: > 최신 기사 목록> time_nanosleep는 posix 신호 메커니즘과 상호 작용합니다

time_nanosleep는 posix 신호 메커니즘과 상호 작용합니다

gitbox 2025-05-28

PHP 프로그래밍에서 Time_nanosleep ()는 나노초 지연을 구현하는 데 사용되는 기능입니다. 기능 프로토 타입은 다음과 같습니다.

 bool time_nanosleep(int $seconds, int $nanoseconds): bool|array

이 기능의 주요 목적은 스크립트 실행 중에 지정된 시간을 일시 중지하는 것입니다. 여기서 $ 초$ 나노 초 매개 변수는 함께 수면의 총 지속 시간을 결정하는 것입니다. 그러나 Time_nanoSleep () 를 사용하는 동안 프로세스가 POSIX 신호를 수신하는 경우 수면이 중단 될 수 있으며, 여기에는 POSIX 신호 메커니즘과의 상호 작용이 포함됩니다.

1. POSIX 신호 소개

POSIX 신호는 UNIX 및 UNIX- 유사 시스템에서 사용하는 메커니즘으로, 특정 비동기 이벤트 (예 : 인터럽트, 종단, 정지 등)의 프로세스에 발생할 수 있습니다. 작동 중에 프로세스는 특정 신호에 응답하기 위해 신호 프로세서 (핸들러)를 등록 할 수 있습니다.

예를 들어:

 pcntl_signal(SIGINT, function() {
    echo "받았다 SIGINT 신호,인터럽트 처리 로직을 실행하십시오。\n";
});

2. TIME_NANOSLEP 및 신호 중단

PHP 스크립트가 Time_NanoSleep () 을 호출하여 수면 상태로 들어가면 운영 체제는 지정된 시간이 지나거나 신호가 수면을 방해 할 때까지 프로세스를 차단 상태로 설정합니다. 신호가 수면이 끊어지면 Time_Nanosleep ()는 단순히 False를 반환하지 않고 나머지 수면 시간이 포함 된 배열을 반환합니다.

예를 들어:

 $result = time_nanosleep(5, 0);
if (is_array($result)) {
    echo "sleep 중단되고 있습니다,남은 시간:{$result['seconds']} 두번째 {$result['nanoseconds']} 纳두번째\n";
}

3. 신호 인터럽트를 올바르게 처리하는 방법

신호가 중단 된 후 개발자가 나머지 수면을 계속 완료하려면 Loop Logic을 사용하여 다음과 같이 Time_nanoSleep ()를 재 시도 할 수 있습니다.

 $seconds = 5;
$nanoseconds = 0;

while (true) {
    $result = time_nanosleep($seconds, $nanoseconds);
    if ($result === true) {
        break; // 휴면을 성공적으로 완료했습니다
    } elseif (is_array($result)) {
        $seconds = $result['seconds'];
        $nanoseconds = $result['nanoseconds'];
        echo "被신호中断,继续남은 시간的休眠...\n";
    } else {
        echo "오류가 발생했습니다,수면에서 뛰어 내리십시오。\n";
        break;
    }
}

4. 신호 처리 인터럽트의 예를 트리거합니다

Time_NanoSleep () 가 신호에 의해 중단되는 상황을 보여주기 위해 PCNTL 과 결합하여 아날로그 신호 인터럽트를 확장 할 수 있습니다.

 declare(ticks = 1);

pcntl_signal(SIGUSR1, function() {
    echo "받았다 SIGUSR1 신호\n";
});

echo "자고 시작합니다...\n";
$pid = getmypid();
$url = "https://gitbox.net/send_signal.php?pid=$pid";
echo "방문하십시오 $url 프로세스로 보내십시오 SIGUSR1 신호\n";

$result = time_nanosleep(10, 0);
if (is_array($result)) {
    echo "sleep 중단되고 있습니다,남아 있습니다:{$result['seconds']} 두번째 {$result['nanoseconds']} 纳두번째\n";
} else {
    echo "sleep 정상적으로 완료되었습니다。\n";
}

참고 : 위의 URL 예제는 gitbox.net 도메인 이름을 사용하여 가상의 인터페이스가 대상 프로세스에 신호를 보낼 수 있음을 나타냅니다.

5. 수면과 잠들고 비교

sleep ()usleep () 와 달리 time_nanoSleep ()는 신호에 의한 중단 상태를 더 명시 적으로 노출시켜 신호에 응답하기 위해보다 자세한 제어 로직을 작성할 때 더 신뢰할 수 있습니다. Sleep () 가 중단되면 남은 초만 반환되는 반면 usleep ()는 직접 실패하고 남은 시간을 제공하지 않습니다.

결론적으로

Time_nanosleep () 함수는 PHP 프로그램의 수면 시간을 정확하게 제어 할뿐만 아니라 Posix 신호 메커니즘과 잘 상호 작용할 수 있습니다. 프로그램이 수면을 수행 할 때, 신호 인터럽트가 발생하면 반품 값을 확인하고 계속 수면을 통해 남은 시간을 얻을 수있어 외부 이벤트에 대한 스크립트의 응답 능력이 향상됩니다. 이 기능은 비동기 신호를 처리 해야하는 장기 실행 스크립트를 작성할 때 특히 중요합니다.