perror ( "…") 및 fprintf (stderr, "…")는 언제 사용해야합니까?
맨 페이지를 읽고 몇 가지 코드는 정말 사이의 차이를 이해하는 나에게 도움이되지 않았다 - 내가 사용해야 할 때, 더 나은 또는 - 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에서 커널로 이동하는 동안 사용자 공간에서 커널 공간으로 이동합니다.
참고 URL : https://stackoverflow.com/questions/12102332/when-should-i-use-perror-and-fprintfstderr
'Programing' 카테고리의 다른 글
인스펙터 (웹킷, 방화범 등)에서 CSS 변경 사항 내보내기 (0) | 2020.08.25 |
---|---|
LINQ Ring : 대규모 컬렉션에 대한 Any () 대 Contains () (0) | 2020.08.25 |
ECMAScript 6 클래스의 게터와 세터는 무엇입니까? (0) | 2020.08.25 |
ngRepeat '추적 기준'표현식 이해 (0) | 2020.08.25 |
기본 쿼리의 각 레코드에 대해 하나의 레코드 (상위 1 개 선택)가 있어야하는 하위 쿼리 (SQL Server)에서 여러 열을 선택하려면 어떻게해야합니까? (0) | 2020.08.25 |