
📌 매뉴얼 (Linux)
NAME
perror - print a system error message
: 시스템 에러 메시지 출력하기
SYNOPSIS
#include <stdio.h>
void perror(const char *s);
#include <errno.h>
const char * const sys_errlist[];
int sys_nerr;
int errno; /* Not really declared this way; see errno(3) */
DESCRIPTION
The perror() function produces a message on standard error describing
the last error encountered during a call to a system or library func‐
tion.
First (if s is not NULL and *s is not a null byte ('\0')), the argument
string s is printed, followed by a colon and a blank. Then an error
message corresponding to the current value of errno and a new-line.
To be of most use, the argument string should include the name of the
function that incurred the error.
The global error list sys_errlist[], which can be indexed by errno, can
be used to obtain the error message without the newline. The largest
message number provided in the table is sys_nerr-1. Be careful when
directly accessing this list, because new error values may not have
been added to sys_errlist[]. The use of sys_errlist[] is nowadays dep‐
recated; use strerror(3) instead.
When a system call fails, it usually returns -1 and sets the variable
errno to a value describing what went wrong. (These values can be
found in <errno.h>.) Many library functions do likewise. The function
perror() serves to translate this error code into human-readable form.
Note that errno is undefined after a successful system call or library
function call: this call may well change this variable, even though it
succeeds, for example because it internally used some other library
function that failed. Thus, if a failing call is not immediately fol‐
lowed by a call to perror(), the value of errno should be saved.
: perror() 함수는 시스템 또는 라이브러리 함수에 대한 호출 중에 발생한 마지막 오류를 설명하는
표준 오류에 대한 메시지를 생성합니다.
먼저 (s가 NULL이 아니고 *s가 NULL 바이트가 아닌 경우('\0')) 인수 문자열이 출력되고
콜론과 블랭크가 차례로 출력됩니다. 그런 다음 errno 및 new-line의 현재 값에 해당하는
오류 메시지가 표시됩니다.
가장 유용하게 사용하려면 인수 문자열에 오류가 발생한 함수의 이름을 포함해야 합니다.
errno로 인덱싱할 수 있는 전역 오류 목록 sys_errlist[]를 사용하여 새 줄 없이 오류 메시지를 얻을 수 있습니다.
표에 제공된 가장 큰 메시지 번호는 sys_nerr-1입니다. 새 오류 값이 sys_errlist[ ]에 추가되지 않았을 수 있으므로
이 목록에 직접 액세스할 때 주의하십시오. 요즘에는 sys_errlist[]의 사용이 권장되지 않습니다.
대신 strerror(3)를 사용하십시오.
시스템 호출이 실패하면 보통 -1을 반환하고 변수 errno를 무엇이 잘못되었는지를 설명하는 값으로 설정합니다.
(이 값들은 <errno.h>에서 찾을 수 있습니다.) 많은 라이브러리 함수들도 마찬가지입니다.
perror 함수는 이 오류 코드를 사람이 읽을 수 있는 형태로 변환하는 역할을 합니다.
errno는 시스템 호출이나 라이브러리 함수 호출이 성공한 후에 정의되지 않습니다.
예를 들어, 이 호출은 성공하더라도 이 변수를 변경할 수 있는데, 이는 실패한 다른 라이브러리 함수를
내부적으로 사용했기 때문입니다. 따라서 실패한 호출이 errno() 호출로 바로 뒤따르지 않으면
errno 값을 저장해야 합니다.
📌 함수 설명
perror() 함수는 에러 내용을 호출해주는 함수이다.
()안에는 char *, 즉 문자열이 들어가는데, 여기에 입력한 문자열을 출력한 뒤 추가로 기존 에러 코드를 출력해준다.
결과 출력 값 : 인자로 입력한 에러메시지 : 원래 에러 메시지
#include <stdio.h>
#include <unistd.h>
int main(void)
{
int file = 10000;
if(close(file) == -1)
perror("잘못된 파일 디스크립터");
return 0;
}
예시로, 파일 디스크립터로 read하지 않은, 이미 닫혀있는 파일 디스크립터 10000을 닫으려하는 코드이다.
if문은 에러 상황이고, 이 때 perror()를 불러와 에러메시지와 함께 설정한 문자열을 함께 출력해준다.
결과)
잘못된 파일 디스크립터 : Bad file descriptor |
그렇다면, 에러가 아닌 상황에서는 어떻게 출력이 될까?
#include <stdio.h>
#include <unistd.h>
int main(void)
{
perror("정상작동");
return 0;
}
결과)
정상작동 : Success |
아무런 에러가 발생하지 않을 코드이다. 그럼 perror에 전달되는 errno가 0이고, 이를 받으면 error가 없어
에러 메시지 대신 Success를 출력하게 된다.
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
int main(void)
{
errno = 4;
perror("정상작동");
return 0;
}
결과)
정상작동 : Interrupted system call |
errno를 직접 수정해서, error가 아닌 상황에도 perror에 errno를 다르게 전달하면 해당 에러 메시지를 출력하게 할 수 있다.
errno는 1 ~ 133 까지 숫자로 정의되어있고, 또는 에러코드로도 작성해도 같이 사용할 수 있다.
위에서처럼, 이 errno가 0이면 에러가 없는 Success 가 출력된다.
[ errno list ]
1 | 0x01 | EPERM | Operation not permitted |
2 | 0x02 | ENOENT | No such file or directory |
3 | 0x03 | ESRCH | No such process |
4 | 0x04 | EINTR | Interrupted system call |
5 | 0x05 | EIO | Input/output error |
6 | 0x06 | ENXIO | No such device or address |
7 | 0x07 | E2BIG | Argument list too long |
8 | 0x08 | ENOEXEC | Exec format error |
9 | 0x09 | EBADF | Bad file descriptor |
10 | 0x0a | ECHILD | No child processes |
11 | 0x0b | EAGAIN | Resource temporarily unavailable |
11 | 0x0b | EWOULDBLOCK | (Same value as EAGAIN) Resource temporarily unavailable |
12 | 0x0c | ENOMEM | Cannot allocate memory |
13 | 0x0d | EACCES | Permission denied |
14 | 0x0e | EFAULT | Bad address |
15 | 0x0f | ENOTBLK | Block device required |
16 | 0x10 | EBUSY | Device or resource busy |
17 | 0x11 | EEXIST | File exists |
18 | 0x12 | EXDEV | Invalid cross-device link |
19 | 0x13 | ENODEV | No such device |
20 | 0x14 | ENOTDIR | Not a directory |
21 | 0x15 | EISDIR | Is a directory |
22 | 0x16 | EINVAL | Invalid argument |
23 | 0x17 | ENFILE | Too many open files in system |
24 | 0x18 | EMFILE | Too many open files |
25 | 0x19 | ENOTTY | Inappropriate ioctl for device |
26 | 0x1a | ETXTBSY | Text file busy |
27 | 0x1b | EFBIG | File too large |
28 | 0x1c | ENOSPC | No space left on device |
29 | 0x1d | ESPIPE | Illegal seek |
30 | 0x1e | EROFS | Read-only file system |
31 | 0x1f | EMLINK | Too many links |
32 | 0x20 | EPIPE | Broken pipe |
33 | 0x21 | EDOM | Numerical argument out of domain |
34 | 0x22 | ERANGE | Numerical result out of range |
35 | 0x23 | EDEADLK | Resource deadlock avoided |
35 | 0x23 | EDEADLOCK | (Same value as EDEADLK) Resource deadlock avoided |
36 | 0x24 | ENAMETOOLONG | File name too long |
37 | 0x25 | ENOLCK | No locks available |
38 | 0x26 | ENOSYS | Function not implemented |
39 | 0x27 | ENOTEMPTY | Directory not empty |
40 | 0x28 | ELOOP | Too many levels of symbolic links |
41 | 0x29 | not implemented | |
42 | 0x2a | ENOMSG | No message of desired type |
43 | 0x2b | EIDRM | Identifier removed |
44 | 0x2c | ECHRNG | Channel number out of range |
45 | 0x2d | EL2NSYNC | Level 2 not synchronized |
46 | 0x2e | EL3HLT | Level 3 halted |
47 | 0x2f | EL3RST | Level 3 reset |
48 | 0x30 | ELNRNG | Link number out of range |
49 | 0x31 | EUNATCH | Protocol driver not attached |
50 | 0x32 | ENOCSI | No CSI structure available |
51 | 0x33 | EL2HLT | Level 2 halted |
52 | 0x34 | EBADE | Invalid exchange |
53 | 0x35 | EBADR | Invalid request descriptor |
54 | 0x36 | EXFULL | Exchange full |
55 | 0x37 | ENOANO | No anode |
56 | 0x38 | EBADRQC | Invalid request code |
57 | 0x39 | EBADSLT | Invalid slot |
58 | 0x3a | not implemented | |
59 | 0x3b | EBFONT | Bad font file format |
60 | 0x3c | ENOSTR | Device not a stream |
61 | 0x3d | ENODATA | No data available |
62 | 0x3e | ETIME | Timer expired |
63 | 0x3f | ENOSR | Out of streams resources |
64 | 0x40 | ENONET | Machine is not on the network |
65 | 0x41 | ENOPKG | Package not installed |
66 | 0x42 | EREMOTE | Object is remote |
67 | 0x43 | ENOLINK | Link has been severed |
68 | 0x44 | EADV | Advertise error |
69 | 0x45 | ESRMNT | Srmount error |
70 | 0x46 | ECOMM | Communication error on send |
71 | 0x47 | EPROTO | Protocol error |
72 | 0x48 | EMULTIHOP | Multihop attempted |
73 | 0x49 | EDOTDOT | RFS specific error |
74 | 0x4a | EBADMSG | Bad message |
75 | 0x4b | EOVERFLOW | Value too large for defined data type |
76 | 0x4c | ENOTUNIQ | Name not unique on network |
77 | 0x4d | EBADFD | File descriptor in bad state |
78 | 0x4e | EREMCHG | Remote address changed |
79 | 0x4f | ELIBACC | Can not access a needed shared library |
80 | 0x50 | ELIBBAD | Accessing a corrupted shared library |
81 | 0x51 | ELIBSCN | .lib section in a.out corrupted |
82 | 0x52 | ELIBMAX | Attempting to link in too many shared libraries |
83 | 0x53 | ELIBEXEC | Cannot exec a shared library directly |
84 | 0x54 | EILSEQ | Invalid or incomplete multibyte or wide character |
85 | 0x55 | ERESTART | Interrupted system call should be restarted |
86 | 0x56 | ESTRPIPE | Streams pipe error |
87 | 0x57 | EUSERS | Too many users |
88 | 0x58 | ENOTSOCK | Socket operation on non-socket |
89 | 0x59 | EDESTADDRREQ | Destination address required |
90 | 0x5a | EMSGSIZE | Message too long |
91 | 0x5b | EPROTOTYPE | Protocol wrong type for socket |
92 | 0x5c | ENOPROTOOPT | Protocol not available |
93 | 0x5d | EPROTONOSUPPORT | Protocol not supported |
94 | 0x5e | ESOCKTNOSUPPORT | Socket type not supported |
95 | 0x5f | EOPNOTSUPP | Operation not supported |
95 | 0x5f | ENOTSUP | (Same value as EOPNOTSUPP) Operation not supported |
96 | 0x60 | EPFNOSUPPORT | Protocol family not supported |
97 | 0x61 | EAFNOSUPPORT | Address family not supported by protocol |
98 | 0x62 | EADDRINUSE | Address already in use |
99 | 0x63 | EADDRNOTAVAIL | Cannot assign requested address |
100 | 0x64 | ENETDOWN | Network is down |
101 | 0x65 | ENETUNREACH | Network is unreachable |
102 | 0x66 | ENETRESET | Network dropped connection on reset |
103 | 0x67 | ECONNABORTED | Software caused connection abort |
104 | 0x68 | ECONNRESET | Connection reset by peer |
105 | 0x69 | ENOBUFS | No buffer space available |
106 | 0x6a | EISCONN | Transport endpoint is already connected |
107 | 0x6b | ENOTCONN | Transport endpoint is not connected |
108 | 0x6c | ESHUTDOWN | Cannot send after transport endpoint shutdown |
109 | 0x6d | ETOOMANYREFS | Too many references: cannot splice |
110 | 0x6e | ETIMEDOUT | Connection timed out |
111 | 0x6f | ECONNREFUSED | Connection refused |
112 | 0x70 | EHOSTDOWN | Host is down |
113 | 0x71 | EHOSTUNREACH | No route to host |
114 | 0x72 | EALREADY | Operation already in progress |
115 | 0x73 | EINPROGRESS | Operation now in progress |
116 | 0x74 | ESTALE | Stale file handle |
117 | 0x75 | EUCLEAN | Structure needs cleaning |
118 | 0x76 | ENOTNAM | Not a XENIX named type file |
119 | 0x77 | ENAVAIL | No XENIX semaphores available |
120 | 0x78 | EISNAM | Is a named type file |
121 | 0x79 | EREMOTEIO | Remote I/O error |
122 | 0x7a | EDQUOT | Disk quota exceeded |
123 | 0x7b | ENOMEDIUM | No medium found |
124 | 0x7c | EMEDIUMTYPE | Wrong medium type |
125 | 0x7d | ECANCELED | Operation canceled |
126 | 0x7e | ENOKEY | Required key not available |
127 | 0x7f | EKEYEXPIRED | Key has expired |
128 | 0x80 | EKEYREVOKED | Key has been revoked |
129 | 0x81 | EKEYREJECTED | Key was rejected by service |
130 | 0x82 | EOWNERDEAD | Owner died |
131 | 0x83 | ENOTRECOVERABLE | State not recoverable |
132 | 0x84 | ERFKILL | Operation not possible due to RF-kill |
133 | 0x85 | EHWPOISON | Memory page has hardware error |
'프로그래밍 > C' 카테고리의 다른 글
[function] access 함수 알아보기 (0) | 2024.05.24 |
---|---|
[function] strerror 함수 알아보기 (0) | 2024.05.23 |
[library] tolower 구현하기 (0) | 2024.05.13 |
[library] toupper 구현하기 (0) | 2024.05.13 |
[library] strdup 구현하기 (0) | 2024.05.13 |