[c] perror ( “…”) 및 fprintf (stderr, “…”)는 언제 사용해야합니까?

맨 페이지를 읽고 몇 가지 코드는 정말 사이의 차이를 이해하는 나에게 도움이되지 않았다 – 내가 사용해야 할 때, 더 나은 또는 – perror("...")fprintf(stderr, "...").



답변

호출 perrorerrnoPOSIX 시스템 호출 에 의해 작성된 스레드 로컬 오류 값인 의 해석 된 값을 제공합니다 (즉, 모든 스레드에는에 대한 자체 값이 있음 errno). 예를 들어를 호출 open()하고 오류가 생성 된 경우 (즉,를 반환 한 경우 -1) perror즉시 호출 하여 실제 오류가 무엇인지 확인할 수 있습니다. 그 동안 다른 syscall을 호출하면 in 값 errno이 덮어 쓰여지고, perror이전 syscall에서 오류가 생성 된 경우 문제를 진단하는 데 호출 이 아무 소용이 없습니다.

fprintf(stderr, ...)반면에 사용자 정의 오류 메시지를 인쇄하는 데 사용할 수 있습니다. 로 인쇄하면 stderr오류보고 출력이로 이동해야하는 “일반”출력과 혼합되는 것을 방지 할 수 있습니다 stdout.

를 호출 하면에 대한 인쇄 된 문자열 값이 생성 되고을 통해 다른 사용자 지정 오류 메시지와 결합 할 수 있기 때문에 fprintf(stderr, "%s\n", strerror(errno))와 비슷합니다 .perror(NULL)strerror(errno)errnofprintf


답변

그들은 다소 다른 일을합니다.

에 해당 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에서 커널로 이동하는 동안 사용자 공간에서 커널 공간으로 이동합니다.


답변