errno, _doserrno, _sys_errlist 및 _sys_nerrerrno, _doserrno, _sys_errlist, and _sys_nerr

프로그램을 실행하는 동안 설정된 오류 코드를 보유한 전역 매크로와 표시용 오류 코드의 문자열에 해당하는 값입니다.Global macros that hold error codes that are set during program execution, and string equivalents of the error codes for display.

구문Syntax

#define errno   (*_errno())  
#define _doserrno   (*__doserrno())  
#define _sys_errlist (__sys_errlist())  
#define _sys_nerr (*__sys_nerr())  

설명Remarks

errno_doserrno는 모두 프로그램을 시작하는 동안 런타임에 0으로 설정됩니다.Both errno and _doserrno are set to 0 by the runtime during program startup. errno는 오류가 발생한 시스템 수준 호출에서 설정됩니다.errno is set on an error in a system-level call. errno에 설정된 마지막 호출에 대한 값이 있으므로 이후 호출에 의해 이 값이 변경될 수도 있습니다.Because errno holds the value for the last call that set it, this value may be changed by succeeding calls. 오류에 대해 errno를 설정하는 런타임 라이브러리 호출은 성공 시 errno를 지우지 않습니다.Run-time library calls that set errno on an error do not clear errno on success. 설정할 수 있는 호출 바로 전에 errno를 호출하여 항상 _set_errno(0)를 지우고 호출 후 바로 확인하세요.Always clear errno by calling _set_errno(0) immediately before a call that may set it, and check it immediately after the call.

오류 발생 시 errno를 시스템 호출에서 반환된 오류 코드와 동일한 값으로 설정할 필요가 없습니다.On an error, errno is not necessarily set to the same value as the error code returned by a system call. I/O 작업의 경우 _doserrnoerrno 코드에 대등한 운영 체제 오류 코드를 저장합니다.For I/O operations, _doserrno stores the operating-system error-code equivalents of errno codes. 대부분의 비I/O 작업의 경우 _doserrno 값이 설정되지 않습니다.For most non-I/O operations, the value of _doserrno is not set.

errno 값은 perror 함수 중 하나를 사용하여 인쇄하거나 strerror 또는 strerror_s 함수 중 하나를 사용하여 문자열에 저장할 수 있는 _sys_errlist의 오류 메시지와 연결되어 있습니다.Each errno value is associated with an error message in _sys_errlist that can be printed by using one of the perror functions, or stored in a string by using one of the strerror or strerror_s functions. perrorstrerror 함수에서 _sys_errlist 배열 및 _sys_nerr(_sys_errlist에서 요소 수)을 사용하여 오류 정보를 처리합니다.The perror and strerror functions use the _sys_errlist array and _sys_nerr—the number of elements in _sys_errlist—to process error information. _sys_errlist_sys_nerr에 대한 직접 액세스는 코드 보안상의 이유로 사용되지 않습니다.Direct access to _sys_errlist and _sys_nerr is deprecated for code-security reasons. 다음과 같이 전역 매크로 대신 더욱 안전한 기능 버전을 사용하는 것이 좋습니다.We recommend that you use the more secure, functional versions instead of the global macros, as shown here:

전역 매크로Global Macro 해당 기능Functional Equivalents
_doserrno _get_doserrno, _set_doserrno_get_doserrno, _set_doserrno
errno _get_errno, _set_errno_get_errno, _set_errno
_sys_errlist, _sys_nerr_sys_errlist, _sys_nerr strerror_s, _strerror_s, _wcserror_s, __wcserror_sstrerror_s, _strerror_s, _wcserror_s, __wcserror_s

라이브러리 수학 루틴이 _matherr을 호출하여 errno를 설정합니다.Library math routines set errno by calling _matherr. 수학 오류를 다르게 처리하려면 _matherr 참조 설명에 따라 고유한 루틴을 작성하고 이름을 _matherr로 지정합니다.To handle math errors differently, write your own routine according to the _matherr reference description and name it _matherr.

다음 표에 있는 모든 errno 값은 <errno.h>에서 미리 정의된 상수이며 UNIX와 호환됩니다.All errno values in the following table are predefined constants in <errno.h>, and are UNIX-compatible. ERANGE, EILSEQEDOM만 ISO C99 표준에 지정되어 있습니다.Only ERANGE, EILSEQ, and EDOM are specified in the ISO C99 standard.

상수Constant 시스템 오류 메시지System error message Value
EPERM 작업이 허용되지 않음Operation not permitted 11
ENOENT 해당 파일 또는 디렉터리 없음No such file or directory 22
ESRCH 해당 프로세스 없음No such process 33
EINTR 중단된 함수Interrupted function 44
EIO I/O 오류I/O error 55
ENXIO 해당 장치 또는 주소 없음No such device or address 66
E2BIG 인수 목록이 너무 김Argument list too long 77
ENOEXEC 실행 형식 오류Exec format error 88
EBADF 잘못된 파일 번호Bad file number 109
ECHILD 생성된 프로세스 없음No spawned processes 1010
EAGAIN 추가 프로세스가 없거나 메모리가 부족하거나 최대 중첩 수주에 도달함No more processes or not enough memory or maximum nesting level reached 1111
ENOMEM 메모리 부족Not enough memory 1212
EACCES 사용 권한이 거부됨Permission denied 1313
EFAULT 잘못된 주소Bad address 1414
EBUSY 장치 또는 리소스 사용 중Device or resource busy 1616
EEXIST 파일이 있음File exists 1717
EXDEV 장치 간 연결Cross-device link 1818
ENODEV 해당 장치 없음No such device 1919
ENOTDIR 디렉터리가 아님Not a directory 2020
EISDIR 디렉터리임Is a directory 2121
EINVAL 잘못된 인수Invalid argument 2222
ENFILE 시스템에 너무 많은 파일이 열려 있음Too many files open in system 2323
EMFILE 열려 있는 파일이 너무 많음Too many open files 2424
ENOTTY 부적절한 I/O 제어 작업Inappropriate I/O control operation 2525
EFBIG 파일이 너무 큼File too large 2727
ENOSPC 장치에 남은 공간이 없음No space left on device 2828
ESPIPE 잘못된 검색Invalid seek 2929
EROFS 읽기 전용 파일 시스템Read-only file system 3030
EMLINK 링크가 너무 많음Too many links 3131
EPIPE 파이프가 끊어짐Broken pipe 3232
EDOM 산술 인수Math argument 3333
ERANGE 결과가 너무 큼Result too large 3434
EDEADLK 리소스 교착 상태가 발생함Resource deadlock would occur 3636
EDEADLOCK 이전 Microsoft C 버전과의 호환성을 위해 EDEADLK와 동일Same as EDEADLK for compatibility with older Microsoft C versions 3636
ENAMETOOLONG 파일 이름이 너무 김Filename too long 3838
ENOLCK 잠금을 사용할 수 없음No locks available 3939
ENOSYS 함수가 지원되지 않음Function not supported 4040
ENOTEMPTY 디렉터리가 비어 있음Directory not empty 4141
EILSEQ 바이트 시퀀스가 잘못됨Illegal byte sequence 4242
STRUNCATE 문자열이 잘림String was truncated 8080

요구 사항Requirements

전역 매크로Global macro 필수 헤더Required header 선택적 헤더Optional header
errno <errno.h> 또는 <stdlib.h>, <cerrno> 또는 <cstdlib>(C++)<errno.h> or <stdlib.h>, <cerrno> or <cstdlib> (C++)
_doserrno, _sys_errlist, _sys_nerr_doserrno, _sys_errlist, _sys_nerr <stdlib.h>, <cstdlib>(C++)<stdlib.h>, <cstdlib> (C++) <errno.h>, <cerrno>(C++)<errno.h>, <cerrno> (C++)

_doserrno, _sys_errlist_sys_nerr 매크로는 Microsoft 확장입니다.The _doserrno, _sys_errlist, and _sys_nerr macros are Microsoft extensions. 호환성에 대한 자세한 내용은 호환성을 참조하세요.For more compatibility information, see Compatibility.

참고 항목See Also

전역 변수 Global Variables
errno 상수 errno Constants
perror, _wperror perror, _wperror
strerror, _strerror, _wcserror, __wcserror strerror, _strerror, _wcserror, __wcserror
strerror_s, _strerror_s, _wcserror_s, __wcserror_s strerror_s, _strerror_s, _wcserror_s, __wcserror_s
_get_doserrno _get_doserrno
_set_doserrno _set_doserrno
_get_errno _get_errno
_set_errno_set_errno