Errno.h
1. 개요
`errno.h`는 POSIX 표준 오류 값과 추가적인 매크로를 정의하는 헤더 파일이다. GNU C 라이브러리(glibc)는 `errno.h`를 통해 POSIX 표준 외에도 다양한 오류 코드를 제공하며, `strerror` 함수를 사용하여 각 오류에 대한 설명을 확인할 수 있다.
Errno.h
설명
| 헤더 파일 | C 프로그램 |
|---|---|
| 용도 | 시스템 오류 번호를 정의하고 관련 함수를 제공함 |
주요 내용
| 정의된 매크로 | EDOM: 입력 인수가 함수의 정의된 영역 외부에 있음 ERANGE: 반환 값이 표현할 수 없을 정도로 큼 EILSEQ: 잘못된 멀티바이트 문자 시퀀스 EACCES: 권한 거부 |
|---|
관련 함수
| 함수 목록 | strerror: 오류 번호에 따른 오류 메시지 문자열 반환 strerror_r: strerror의 스레드 안전 버전 |
|---|
📚 더 읽어볼만한 페이지
-
C 표준 라이브러리 헤더 -
Stdio.h
`stdio.h`는 C 프로그래밍 언어의 표준 입출력 라이브러리 헤더 파일로, 파일 조작 및 콘솔 입출력 함수, `EOF`, `NULL` 등의 상수, `stdin`, `stdout`, `stderr` 같은 표준 스트림 변수, 그리고 `FILE` 형식을 제공하며, `gets()` 함수와 같은 보안 취약점에 대한 주의가 필요하다. -
C 표준 라이브러리 헤더 -
Stdlib.h
`stdlib.h`는 C 표준 라이브러리의 헤더 파일로서 문자열 변환, 의사 난수 생성, 동적 메모리 관리, 프로세스 제어, 검색/정렬, 정수 산술 연산과 관련된 함수들을 정의하며 C 프로그래밍의 기본적인 기능 구현에 필수적이다.
2. POSIX 오류
POSIX 표준은 유닉스 계열 운영 체제에서 시스템 호출 오류를 나타내는 `errno` 변수와 관련된 오류 코드들을 정의한다. 이 오류 코드들은 `errno.h` 헤더 파일에 매크로 형태로 정의되어 있으며, `strerror` 함수를 통해 각 오류 코드에 해당하는 문자열 설명을 얻을 수 있다.
GNU C 라이브러리(GLIBC)는 POSIX 표준 외 추가적인 오류 값 매크로를 제공한다. 다음 표는 `strerror`가 제공하는 매크로에 대한 설명이다.
| 심볼 | 값 | 설명 |
|---|---|---|
| EPERM | 1 | 연산이 허용되지 않음 |
| ENOENT | 2 | 파일 또는 디렉토리가 없음 |
| ESRCH | 3 | 프로세스가 없음 |
| EINTR | 4 | 인터럽트된 시스템 호출 |
| EIO | 5 | 입/출력 오류 |
| ENXIO | 6 | 장치 또는 주소가 없음 |
| E2BIG | 7 | 인자 목록이 너무 김 |
| ENOEXEC | 8 | 실행 형식 오류 |
| EBADF | 9 | 잘못된 파일 디스크립터 |
| ECHILD | 10 | 자식 프로세스가 없음 |
| EAGAIN | 11 | 리소스가 일시적으로 사용 불가능함 |
| ENOMEM | 12 | 메모리 할당 불가 |
| EACCES | 13 | 권한 거부 |
| EFAULT | 14 | 잘못된 주소 |
| ENOTBLK | 15 | 블록 장치가 필요함 |
| EBUSY | 16 | 장치 또는 리소스가 사용 중임 |
| EEXIST | 17 | 파일이 존재함 |
| EXDEV | 18 | 잘못된 장치 간 링크 |
| ENODEV | 19 | 장치가 없음 |
| ENOTDIR | 20 | 디렉토리가 아님 |
| EISDIR | 21 | 디렉토리임 |
| EINVAL | 22 | 잘못된 인자 |
| ENFILE | 23 | 시스템에 열린 파일이 너무 많음 |
| EMFILE | 24 | 열린 파일이 너무 많음 |
| ENOTTY | 25 | 장치에 부적절한 ioctl |
| ETXTBSY | 26 | 텍스트 파일이 사용 중임 |
| EFBIG | 27 | 파일이 너무 큼 |
| ENOSPC | 28 | 장치에 공간이 없음 |
| ESPIPE | 29 | 불법 탐색 |
| EROFS | 30 | 읽기 전용 파일 시스템 |
| EMLINK | 31 | 링크가 너무 많음 |
| EPIPE | 32 | 파이프 손상 |
| EDOM | 33 | 수치 인자가 범위 밖임 |
| ERANGE | 34 | 수치 결과가 범위 밖임 |
| EDEADLK | 35 | 리소스 교착 상태 회피 |
| ENAMETOOLONG | 36 | 파일 이름이 너무 김 |
| ENOLCK | 37 | 사용 가능한 잠금이 없음 |
| ENOSYS | 38 | 함수가 구현되지 않음 |
| ENOTEMPTY | 39 | 디렉토리가 비어 있지 않음 |
| ELOOP | 40 | 심볼릭 링크 레벨이 너무 많음 |
| ENOMSG | 42 | 원하는 유형의 메시지가 없음 |
| EIDRM | 43 | 식별자가 제거됨 |
| ECHRNG | 44 | 채널 번호가 범위 밖임 |
| EL2NSYNC | 45 | 레벨 2가 동기화되지 않음 |
| EL3HLT | 46 | 레벨 3이 중지됨 |
| EL3RST | 47 | 레벨 3이 재설정됨 |
| ELNRNG | 48 | 링크 번호가 범위 밖임 |
| EUNATCH | 49 | 프로토콜 드라이버가 연결되지 않음 |
| ENOCSI | 50 | CSI 구조를 사용할 수 없음 |
| EL2HLT | 51 | 레벨 2가 중지됨 |
| EBADE | 52 | 잘못된 교환 |
| EBADR | 53 | 잘못된 요청 디스크립터 |
| EXFULL | 54 | 교환이 가득 참 |
| ENOANO | 55 | 노드가 없음 |
| EBADRQC | 56 | 잘못된 요청 코드 |
| EBADSLT | 57 | 잘못된 슬롯 |
| EBFONT | 59 | 잘못된 글꼴 파일 형식 |
| ENOSTR | 60 | 장치가 스트림이 아님 |
| ENODATA | 61 | 사용 가능한 데이터가 없음 |
| ETIME | 62 | 타이머 만료 |
| ENOSR | 63 | 스트림 리소스 부족 |
| ENONET | 64 | 시스템이 네트워크에 연결되지 않음 |
| ENOPKG | 65 | 패키지가 설치되지 않음 |
| EREMOTE | 66 | 객체가 원격임 |
| ENOLINK | 67 | 링크가 끊어짐 |
| EADV | 68 | 광고 오류 |
| ESRMNT | 69 | srmount 오류 |
| ECOMM | 70 | 전송 중 통신 오류 |
| EPROTO | 71 | 프로토콜 오류 |
| EMULTIHOP | 72 | 다중 홉 시도 |
| EDOTDOT | 73 | RFS 관련 오류 |
| EBADMSG | 74 | 잘못된 메시지 |
| EOVERFLOW | 75 | 정의된 데이터 형식에 대한 값이 너무 큼 |
| ENOTUNIQ | 76 | 네트워크에서 이름이 고유하지 않음 |
| EBADFD | 77 | 파일 디스크립터 상태가 잘못됨 |
| EREMCHG | 78 | 원격 주소가 변경됨 |
| ELIBACC | 79 | 필요한 공유 라이브러리에 접근할 수 없음 |
| ELIBBAD | 80 | 손상된 공유 라이브러리에 접근함 |
| ELIBSCN | 81 | a.out의 .lib 섹션이 손상됨 |
| ELIBMAX | 82 | 너무 많은 공유 라이브러리를 링크하려고 시도함 |
| ELIBEXEC | 83 | 공유 라이브러리를 직접 실행할 수 없음 |
| EILSEQ | 84 | 잘못되었거나 불완전한 멀티바이트 또는 와이드 문자 |
| ERESTART | 85 | 인터럽트된 시스템 호출을 다시 시작해야 함 |
| ESTRPIPE | 86 | 스트림 파이프 오류 |
| EUSERS | 87 | 사용자가 너무 많음 |
| ENOTSOCK | 88 | 소켓이 아닌 곳에서 소켓 연산 |
| EDESTADDRREQ | 89 | 대상 주소가 필요함 |
| EMSGSIZE | 90 | 메시지가 너무 큼 |
| EPROTOTYPE | 91 | 소켓에 대한 프로토콜 유형이 잘못됨 |
| ENOPROTOOPT | 92 | 프로토콜을 사용할 수 없음 |
| EPROTONOSUPPORT | 93 | 프로토콜이 지원되지 않음 |
| ESOCKTNOSUPPORT | 94 | 소켓 유형이 지원되지 않음 |
| EOPNOTSUPP | 95 | 연산이 지원되지 않음 |
| EPFNOSUPPORT | 96 | 프로토콜 패밀리가 지원되지 않음 |
| EAFNOSUPPORT | 97 | 프로토콜에서 지원하지 않는 주소 패밀리 |
| EADDRINUSE | 98 | 주소가 이미 사용 중임 |
| EADDRNOTAVAIL | 99 | 요청된 주소를 할당할 수 없음 |
| ENETDOWN | 100 | 네트워크가 다운됨 |
| ENETUNREACH | 101 | 네트워크에 연결할 수 없음 |
| ENETRESET | 102 | 네트워크가 재설정 시 연결을 끊음 |
| ECONNABORTED | 103 | 소프트웨어로 인해 연결이 중단됨 |
| ECONNRESET | 104 | 피어에 의해 연결이 재설정됨 |
| ENOBUFS | 105 | 사용 가능한 버퍼 공간이 없음 |
| EISCONN | 106 | 전송 엔드포인트가 이미 연결됨 |
| ENOTCONN | 107 | 전송 엔드포인트가 연결되지 않음 |
| ESHUTDOWN | 108 | 전송 엔드포인트가 종료된 후 보낼 수 없음 |
| ETOOMANYREFS | 109 | 참조가 너무 많음: 스플라이스 불가 |
| ETIMEDOUT | 110 | 연결 시간 초과 |
| ECONNREFUSED | 111 | 연결 거부 |
| EHOSTDOWN | 112 | 호스트가 다운됨 |
| EHOSTUNREACH | 113 | 호스트에 대한 경로 없음 |
| EALREADY | 114 | 연산이 이미 진행 중임 |
| EINPROGRESS | 115 | 연산이 현재 진행 중임 |
| ESTALE | 116 | 오래된 파일 핸들 |
| EUCLEAN | 117 | 구조를 정리해야 함 |
| ENOTNAM | 118 | XENIX 명명된 유형 파일이 아님 |
| ENAVAIL | 119 | 사용 가능한 XENIX 세마포어가 없음 |
| EISNAM | 120 | 명명된 유형의 파일임 |
| EREMOTEIO | 121 | 원격 I/O 오류 |
| EDQUOT | 122 | 디스크 할당량 초과 |
| ENOMEDIUM | 123 | 매체를 찾을 수 없음 |
| EMEDIUMTYPE | 124 | 잘못된 매체 유형 |
| ECANCELED | 125 | 연산이 취소됨 |
| ENOKEY | 126 | 필요한 키를 사용할 수 없음 |
| EKEYEXPIRED | 127 | 키가 만료됨 |
| EKEYREVOKED | 128 | 키가 해지됨 |
| EKEYREJECTED | 129 | 키가 서비스에서 거부됨 |
| EOWNERDEAD | 130 | 소유자가 죽음 |
| ENOTRECOVERABLE | 131 | 상태를 복구할 수 없음 |
| ERFKILL | 132 | RF-kill로 인해 연산이 불가능함 |
| EHWPOISON | 133 | 메모리 페이지에 하드웨어 오류가 있음 |
2.1. GNU C 라이브러리 (glibc) 추가 오류 코드
GNU C 라이브러리(GLIBC)는 헤더 파일에서 추가적인 POSIX 오류 값 매크로를 제공한다. 다음은 strerror가 제공하는 매크로에 대한 설명이다.
| 심볼 | 값 | 설명 |
|---|---|---|
| EPERM | 1 | 연산이 허용되지 않음 |
| ENOENT | 2 | 파일 또는 디렉토리가 없음 |
| ESRCH | 3 | 프로세스가 없음 |
| EINTR | 4 | 인터럽트된 시스템 호출 |
| EIO | 5 | 입/출력 오류 |
| ENXIO | 6 | 장치 또는 주소가 없음 |
| E2BIG | 7 | 인자 목록이 너무 김 |
| ENOEXEC | 8 | 실행 형식 오류 |
| EBADF | 9 | 잘못된 파일 디스크립터 |
| ECHILD | 10 | 자식 프로세스가 없음 |
| EAGAIN | 11 | 리소스가 일시적으로 사용 불가능함 |
| ENOMEM | 12 | 메모리 할당 불가 |
| EACCES | 13 | 권한 거부 |
| EFAULT | 14 | 잘못된 주소 |
| ENOTBLK | 15 | 블록 장치가 필요함 |
| EBUSY | 16 | 장치 또는 리소스가 사용 중임 |
| EEXIST | 17 | 파일이 존재함 |
| EXDEV | 18 | 잘못된 장치 간 링크 |
| ENODEV | 19 | 장치가 없음 |
| ENOTDIR | 20 | 디렉토리가 아님 |
| EISDIR | 21 | 디렉토리임 |
| EINVAL | 22 | 잘못된 인자 |
| ENFILE | 23 | 시스템에 열린 파일이 너무 많음 |
| EMFILE | 24 | 열린 파일이 너무 많음 |
| ENOTTY | 25 | 장치에 부적절한 ioctl |
| ETXTBSY | 26 | 텍스트 파일이 사용 중임 |
| EFBIG | 27 | 파일이 너무 큼 |
| ENOSPC | 28 | 장치에 공간이 없음 |
| ESPIPE | 29 | 불법 탐색 |
| EROFS | 30 | 읽기 전용 파일 시스템 |
| EMLINK | 31 | 링크가 너무 많음 |
| EPIPE | 32 | 파이프 손상 |
| EDOM | 33 | 수치 인자가 범위 밖임 |
| ERANGE | 34 | 수치 결과가 범위 밖임 |
| EDEADLK | 35 | 리소스 교착 상태 회피 |
| ENAMETOOLONG | 36 | 파일 이름이 너무 김 |
| ENOLCK | 37 | 사용 가능한 잠금이 없음 |
| ENOSYS | 38 | 함수가 구현되지 않음 |
| ENOTEMPTY | 39 | 디렉토리가 비어 있지 않음 |
| ELOOP | 40 | 심볼릭 링크 레벨이 너무 많음 |
| ENOMSG | 42 | 원하는 유형의 메시지가 없음 |
| EIDRM | 43 | 식별자가 제거됨 |
| ECHRNG | 44 | 채널 번호가 범위 밖임 |
| EL2NSYNC | 45 | 레벨 2가 동기화되지 않음 |
| EL3HLT | 46 | 레벨 3이 중지됨 |
| EL3RST | 47 | 레벨 3이 재설정됨 |
| ELNRNG | 48 | 링크 번호가 범위 밖임 |
| EUNATCH | 49 | 프로토콜 드라이버가 연결되지 않음 |
| ENOCSI | 50 | CSI 구조를 사용할 수 없음 |
| EL2HLT | 51 | 레벨 2가 중지됨 |
| EBADE | 52 | 잘못된 교환 |
| EBADR | 53 | 잘못된 요청 디스크립터 |
| EXFULL | 54 | 교환이 가득 참 |
| ENOANO | 55 | 노드가 없음 |
| EBADRQC | 56 | 잘못된 요청 코드 |
| EBADSLT | 57 | 잘못된 슬롯 |
| EBFONT | 59 | 잘못된 글꼴 파일 형식 |
| ENOSTR | 60 | 장치가 스트림이 아님 |
| ENODATA | 61 | 사용 가능한 데이터가 없음 |
| ETIME | 62 | 타이머 만료 |
| ENOSR | 63 | 스트림 리소스 부족 |
| ENONET | 64 | 시스템이 네트워크에 연결되지 않음 |
| ENOPKG | 65 | 패키지가 설치되지 않음 |
| EREMOTE | 66 | 객체가 원격임 |
| ENOLINK | 67 | 링크가 끊어짐 |
| EADV | 68 | 광고 오류 |
| ESRMNT | 69 | srmount 오류 |
| ECOMM | 70 | 전송 중 통신 오류 |
| EPROTO | 71 | 프로토콜 오류 |
| EMULTIHOP | 72 | 다중 홉 시도 |
| EDOTDOT | 73 | RFS 관련 오류 |
| EBADMSG | 74 | 잘못된 메시지 |
| EOVERFLOW | 75 | 정의된 데이터 형식에 대한 값이 너무 큼 |
| ENOTUNIQ | 76 | 네트워크에서 이름이 고유하지 않음 |
| EBADFD | 77 | 파일 디스크립터 상태가 잘못됨 |
| EREMCHG | 78 | 원격 주소가 변경됨 |
| ELIBACC | 79 | 필요한 공유 라이브러리에 접근할 수 없음 |
| ELIBBAD | 80 | 손상된 공유 라이브러리에 접근함 |
| ELIBSCN | 81 | a.out의 .lib 섹션이 손상됨 |
| ELIBMAX | 82 | 너무 많은 공유 라이브러리를 링크하려고 시도함 |
| ELIBEXEC | 83 | 공유 라이브러리를 직접 실행할 수 없음 |
| EILSEQ | 84 | 잘못되었거나 불완전한 멀티바이트 또는 와이드 문자 |
| ERESTART | 85 | 인터럽트된 시스템 호출을 다시 시작해야 함 |
| ESTRPIPE | 86 | 스트림 파이프 오류 |
| EUSERS | 87 | 사용자가 너무 많음 |
| ENOTSOCK | 88 | 소켓이 아닌 곳에서 소켓 연산 |
| EDESTADDRREQ | 89 | 대상 주소가 필요함 |
| EMSGSIZE | 90 | 메시지가 너무 큼 |
| EPROTOTYPE | 91 | 소켓에 대한 프로토콜 유형이 잘못됨 |
| ENOPROTOOPT | 92 | 프로토콜을 사용할 수 없음 |
| EPROTONOSUPPORT | 93 | 프로토콜이 지원되지 않음 |
| ESOCKTNOSUPPORT | 94 | 소켓 유형이 지원되지 않음 |
| EOPNOTSUPP | 95 | 연산이 지원되지 않음 |
| EPFNOSUPPORT | 96 | 프로토콜 패밀리가 지원되지 않음 |
| EAFNOSUPPORT | 97 | 프로토콜에서 지원하지 않는 주소 패밀리 |
| EADDRINUSE | 98 | 주소가 이미 사용 중임 |
| EADDRNOTAVAIL | 99 | 요청된 주소를 할당할 수 없음 |
| ENETDOWN | 100 | 네트워크가 다운됨 |
| ENETUNREACH | 101 | 네트워크에 연결할 수 없음 |
| ENETRESET | 102 | 네트워크가 재설정 시 연결을 끊음 |
| ECONNABORTED | 103 | 소프트웨어로 인해 연결이 중단됨 |
| ECONNRESET | 104 | 피어에 의해 연결이 재설정됨 |
| ENOBUFS | 105 | 사용 가능한 버퍼 공간이 없음 |
| EISCONN | 106 | 전송 엔드포인트가 이미 연결됨 |
| ENOTCONN | 107 | 전송 엔드포인트가 연결되지 않음 |
| ESHUTDOWN | 108 | 전송 엔드포인트가 종료된 후 보낼 수 없음 |
| ETOOMANYREFS | 109 | 참조가 너무 많음: 스플라이스 불가 |
| ETIMEDOUT | 110 | 연결 시간 초과 |
| ECONNREFUSED | 111 | 연결 거부 |
| EHOSTDOWN | 112 | 호스트가 다운됨 |
| EHOSTUNREACH | 113 | 호스트에 대한 경로 없음 |
| EALREADY | 114 | 연산이 이미 진행 중임 |
| EINPROGRESS | 115 | 연산이 현재 진행 중임 |
| ESTALE | 116 | 오래된 파일 핸들 |
| EUCLEAN | 117 | 구조를 정리해야 함 |
| ENOTNAM | 118 | XENIX 명명된 유형 파일이 아님 |
| ENAVAIL | 119 | 사용 가능한 XENIX 세마포어가 없음 |
| EISNAM | 120 | 명명된 유형의 파일임 |
| EREMOTEIO | 121 | 원격 I/O 오류 |
| EDQUOT | 122 | 디스크 할당량 초과 |
| ENOMEDIUM | 123 | 매체를 찾을 수 없음 |
| EMEDIUMTYPE | 124 | 잘못된 매체 유형 |
| ECANCELED | 125 | 연산이 취소됨 |
| ENOKEY | 126 | 필요한 키를 사용할 수 없음 |
| EKEYEXPIRED | 127 | 키가 만료됨 |
| EKEYREVOKED | 128 | 키가 해지됨 |
| EKEYREJECTED | 129 | 키가 서비스에서 거부됨 |
| EOWNERDEAD | 130 | 소유자가 죽음 |
| ENOTRECOVERABLE | 131 | 상태를 복구할 수 없음 |
| ERFKILL | 132 | RF-kill로 인해 연산이 불가능함 |
| EHWPOISON | 133 | 메모리 페이지에 하드웨어 오류가 있음 |