나는 UNIX 시스템에 관한 책을 읽고 있는데 신호 섹션에 대해 논의하고 있습니다. 시스템 호출이 실행되고 신호가 수신될 때 어떤 일이 발생하는지에 관해서는 약간 혼란스럽습니다. 이는 운영 체제가 read()
신호 인터럽트를 수신할 때 특정 시스템 호출(예:)의 다시 시작을 예약한다는 의미입니다.
그러나 신호에 대한 매뉴얼 페이지를 읽을 때 다음과 같이 진행됩니다.
일부 시스템 호출의 경우 호출이 실행되는 동안 신호가 포착되어 호출이 일찍 종료되면 호출이 자동으로 다시 시작됩니다. signal(3)을 사용하여 설치된 모든 처리기에는 SA_RESTART 플래그가 설정되어 있으며 이는 다시 시작 가능한 시스템 호출이 신호를 받은 후에 반환되지 않음을 의미합니다. 영향을 받는 시스템 호출에는 통신 채널이나 저속 장치 및 ioctl(2) 동안의 read(2), write(2), sendto(2), recvfrom(2), sendmsg(2) 및 recvmsg(2)가 포함됩니다. 잠깐만요(2). 하지만, 제출된 호출이 다시 시작되지 않지만 부분적인 성공을 반환합니다.(예: 짧은 읽기 횟수) 이러한 의미는 siginterrupt(3)를 사용하여 변경할 수 있습니다.
"제출된 통화"는 무엇을 의미하나요?
신호 중단으로 인해 읽기가 제대로 작동하지 않을 수 있습니까?
신호로 인해 읽기가 실패하거나 비정상적으로 동작하는 경우 이를 방지하려면 어떻게 해야 합니까?
샘플 코드와 함께 답변해 주셔서 감사합니다.