programing

errno 확인 중!= EINTR: 무슨 뜻입니까?

sourcetip 2022. 8. 15. 09:58
반응형

errno 확인 중!= EINTR: 무슨 뜻입니까?

이 코드 조각을 여러 번 찾았습니다(또한 유사한 코드가 사용되고 있습니다).open()대신write()).

int c = write(fd, &v, sizeof(v));
if (c == -1 && errno != EINTR) {
    perror("Write to output file");
    exit(EXIT_FAILURE);
}

체크되는 이유&& errno != EINTR여기?

찾고 있다errno는 남자에 대해 다음과 같은 글을 발견했다.EINTR, 하지만 내가 방문했더라도man 7 signal그게 날 깨우쳐주진 않아

EINTR Interrupted Function Call(POSIX.1; 중단 함수 호출). signal(7)을 참조해 주세요.

많은 시스템 콜이 보고합니다.EINTR에러 코드(시스템 콜의 진행중에 신호가 발생했을 경우).실제로 에러는 발생하지 않았습니다.시스템이 자동적으로 시스템콜을 재개할 수 없기 때문에, 에러가 보고되고 있을 뿐입니다.이 코딩 패턴은 이 경우 인터럽트를 무시하기 위해 시스템콜을 재시도합니다

예를 들어, 이 문제는 프로그램이 다음을 사용하는 경우 발생할 수 있습니다.alarm()타이머가 부족할 때 일부 코드를 비동기적으로 실행합니다.프로그램이 호출하는 동안 시간 초과가 발생한 경우write()시스템 콜(읽기/쓰기 등)을 재시도하는 것 뿐입니다.

여기 답변은 매우 좋으며, 저는 몇 가지 내부 세부사항을 추가하고 싶습니다.

신호에 의해 중단되는 시스템콜은 중단되거나 반환될 수 있습니다.EINTR또는 자동적으로 재기동합니다.SA_RESTART에 기재되어 있습니다.sigaction(2)

그리고 이 작업을 담당하는 사람은restart_block시스템 콜을 재시작하기 위한 정보와 인수를 추적하기 위해 사용됩니다.

의 man 페이지에서write:

데이터가 기록되기 전에 신호에 의해 콜이 중단되었습니다.

언급URL : https://stackoverflow.com/questions/41474299/checking-if-errno-eintr-what-does-it-mean

반응형