맨 페이지를 읽고 몇 가지 코드는 정말 사이의 차이를 이해하는 나에게 도움이되지 않았다 – 내가 사용해야 할 때, 더 나은 또는 – perror("...")
나 fprintf(stderr, "...")
.
답변
호출 perror
은 errno
POSIX 시스템 호출 에 의해 작성된 스레드 로컬 오류 값인 의 해석 된 값을 제공합니다 (즉, 모든 스레드에는에 대한 자체 값이 있음 errno
). 예를 들어를 호출 open()
하고 오류가 생성 된 경우 (즉,를 반환 한 경우 -1
) perror
즉시 호출 하여 실제 오류가 무엇인지 확인할 수 있습니다. 그 동안 다른 syscall을 호출하면 in 값 errno
이 덮어 쓰여지고, perror
이전 syscall에서 오류가 생성 된 경우 문제를 진단하는 데 호출 이 아무 소용이 없습니다.
fprintf(stderr, ...)
반면에 사용자 정의 오류 메시지를 인쇄하는 데 사용할 수 있습니다. 로 인쇄하면 stderr
오류보고 출력이로 이동해야하는 “일반”출력과 혼합되는 것을 방지 할 수 있습니다 stdout
.
를 호출 하면에 대한 인쇄 된 문자열 값이 생성 되고을 통해 다른 사용자 지정 오류 메시지와 결합 할 수 있기 때문에 fprintf(stderr, "%s\n", strerror(errno))
와 비슷합니다 .perror(NULL)
strerror(errno)
errno
fprintf
답변
그들은 다소 다른 일을합니다.
에 해당 perror()
하는 메시지를 인쇄하는 데 사용 stderr
합니다 errno
. 당신이 사용하는 fprintf()
인쇄 무엇 을 stderr
, 또는 어떤 다른 스트림을. perror()
매우 전문화 된 인쇄 기능입니다.
perror(str);
다음과 같다
if (str)
fprintf(stderr, "%s: %s\n", str, strerror(errno));
else
fprintf(stderr, "%s\n", strerror(errno));
답변
perror(const char *s)
: 사용자가 제공 한 문자열 뒤에의 현재 값을 설명하는 문자열을 인쇄합니다 errno
.
stderr
: 자신의 오류 메시지를 (기본값은 터미널)로 파이프하는 데 사용되는 출력 스트림입니다.
관련된:
char *strerror(int errnum)
: 오류 번호를 제공하면 관련 오류 문자열을 반환합니다.
답변
perror ()는 항상 stderr에 기록합니다. fprintf ()와 함께 사용되는 strerr ()은 stderr을 포함하여 모든 출력에 쓸 수 있지만 배타적이지는 않습니다.
fprintf(stdout, "Error: %s", strerror(errno));
fprintf(stderr, "Error: %s", strerror(errno)); // which is equivalent to perror("Error")
또한 perror는 “text : error description”이라는 자체 텍스트 형식을 부과합니다.
답변
Perror 함수는 실행 호출을 수행하는 데 더 많은 시간이 소요됩니다. fprintf 호출은 API에서 커널로 이동하는 동안 사용자 공간에서 커널 공간으로 이동합니다.