저는 Unix 시스템 프로그래밍 프로그램을 작성하고 있는데 요구 사항 중 하나는 시스템 호출에서 반환되는 가능한 모든 오류를 처리하는 것입니다.
따라서 각 시스템 호출에 전담하는 함수를 두는 것보다 이 책임을 담당하는 함수를 갖고 싶습니다. 그렇다면 반환된 모든 오류 번호는 고유합니까? 그렇지 않다면 어떤 중복 영역이 존재합니까?
답변1
두 가지 측면이 있습니다. 시스템 호출이 오류를 알리는 방식과 오류가 발생하는 방식이 보고됩니다.
대부분의 시스템 호출은 -1을 반환하여 오류가 발생했음을 나타내지만 이것이 완전히 보편적인 것은 아닙니다(예: 일부 시스템 호출은 항상 성공합니다 getpid
).
오류가 발생한 것을 알고 있는 경우 오류 코드는 항상 errno
¹에 있습니다. 가지다표준 값은 다음과 같이 정의됩니다.errno.h
, 각 UNIX 변형에는 고유한 내용이 추가됩니다. 오류 코드는 이름이 ;로 시작하는 상수로 식별됩니다 E
. 값은 운영 체제에 따라 다릅니다. 이러한 오류 코드는 표준이지만(예: EACCESS
항상 "권한이 거부됨"을 의미하고 EIO
항상 "입력/출력 오류"를 의미함) 각 오류 메시지의 정확한 의미는 시스템 호출에 따라 다릅니다.
표준 기능strerror
그리고perror
사용자에게 표시될 수 있는 오류 메시지를 제공합니다.
1마지막 시스템 호출이나 C 라이브러리 함수 호출 중에 오류가 발생하지 않은 경우 가비지 가 포함될 수 있습니다 .errno
답변2
내가 아는 유일한 중복은 AT&T와 BSD 파생 Unix 사이에 역사적 차이가 있었던 영역의 동의어입니다. 예를 들어, AT&T Unix는 EAGAIN
BSD와 같은 것을 의미하므로 EWOULDBLOCK
둘 다 정의된 시스템에서 동일한 값을 갖습니다.
답변3
errno.h
아니요, 특정 시스템에는 중복이 있어서는 안 됩니다. in 등과 같이 E로 시작하는 정의가 있는지 확인하고 errno.h
(아마도 /usr/include 아래) 각 경우를 처리하는 명령문을 ENOENT
작성하십시오 . switch()
그런 다음 모든 시스템 호출 오류에 대해 자체 함수를 호출할 수 있습니다.
(구현하는 것과 매우 유사하게 들립니다 perror(3)
.