2017-01-04 1 views
3

나는이 코드 조각이 여러 번 사용되었다는 것을 발견했습니다. write() 대신에 open()이 사용 된 유사한 코드도 있습니다. 이 여기 && errno != EINTR 경우 체크 왜만약 errno! = EINTR : 그것이 무엇을 의미합니까?

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

? 사람errno을 찾고

나는 EINTR에 대해 다음 텍스트를 찾았지만, 내가 가르치 려하지 않습니다 man 7 signal를 방문한 경우에도 마찬가지입니다.

EINTR 중단 된 함수 호출 (POSIX.1); 신호 (7) 참조. 에서

+2

대신 '쓰기'에 대한 매뉴얼 페이지를 확인하십시오. 그것은 특정 오류에서 errno가 설정되는 것을 알려 주어야합니다. – Kevin

+1

'write()'는'ssize_t'를 리턴하고 **는'int'를 리턴하지 않는다는 점에 유의하십시오. 그들은 동일하지 않습니다. –

+1

둘 다 감사합니다! @AndrewHenle 내가 아는 한 코드 조각을 복사하기로 결정했다. 나는'int' 대신'ssize_t'를 사용하여 질문을 모두 편집해야한다고 생각합니까? – Robb1

답변

7

많은 시스템 호출을 작성되기 전에 호출이 신호에 의해 중단 시스템 호출이 진행 중입니다. 시스템이 자동으로 시스템 호출을 재개 할 수 없기 때문에 실제로는 오류가 발생하지 않았습니다. 이 코딩 패턴은 인터럽트를 무시하기 위해 시스템 호출을 재 시도합니다.

예를 들어, 타이머가 만료되었을 때 프로그램이 alarm()을 사용하여 일부 코드를 비동기 적으로 실행하는 경우이 문제가 발생할 수 있습니다. 프로그램이 write()을 호출하는 동안 시간 초과가 발생하면 다시 시작하기 만하면됩니다.

1

man pagewrite에 :

신호가 동안 발생한 경우 모든 데이터가 EINTR 오류 코드를보고합니다

+0

이 답변으로는 충분하지 않습니다. 'EINTR'이 일어날 수있는 (또는 더 중요한 것은 불가능한) 상황을 설명하지 못한다. 나는 그것이 보통 일어날 수 없다는 것을 이해하지 못하는 것이 끝없는화물 양성의 원인이기 때문에 후자를 더 중요하게 생각한다. –

+0

@R .. *이 답변은 실제로 충분하지 않습니다. 'EINTR'이 일어날 수있는 (또는 더 중요한 것은 불가능한) 상황을 설명하지 못한다. 나는 일반적으로 일어날 수 없다는 것을 이해하지 않으면 끝없는 카고 바육의 원인이되기 때문에 후자를 더 중요하게 생각합니다. * 프로세스 카 운드 (cargo cult)를하지 않으면 프로세스의 신호 마스크와 같은 것을 바꿀 수 있습니다 어디서나. 전혀 관련이없는 것으로 무너질 수있는 깨지기 쉬운 코드를 작성하는 것이 좋다면 그것은 선택입니다. 그러나 강건한 코드 작성을 "화물 운반"이라고 특징 지우지 마십시오. –

+0

@AndrewHenle : 인터럽트 신호 처리기를 설치하는 것은 인터럽트되는 시스템 호출을 막아 내고 싶을 때 침입하고 의도적 인 일입니다. 실제로 일어날 때 반복하는 반복은 일반적으로 당신이 정말로 그 행동을 원한다는 것을 알 때만, 일반적으로 이해가되지 않습니다. –