프로그램이 초기화될 때 errno가 0으로 설정되고 오류가 발생하기 전에 테스트할 수 없는 이유는 무엇입니까? [폐쇄]

프로그램이 초기화될 때 errno가 0으로 설정되고 오류가 발생하기 전에 테스트할 수 없는 이유는 무엇입니까? [폐쇄]

errno헤더 파일 변수에 사용 가능한 자료를 읽고 있습니다 .<errno.h>

나는 읽었다:

"값이 0이면 프로그램에 오류가 없음을 나타냅니다." 및 " errno프로그램이 초기화될 때 개발자는 0으로 설정해야 합니다."

관례적으로 우리는 errno오류가 발생할 때만 변수를 확인합니다(예: -1을 반환하는 일부 함수).

errno질문 1: 그러면 프로그램을 시작하기 전에 0으로 설정하면 어떻게 되나요?

더 나아가, 오류 번호를 로컬 변수에 저장한 다음 확인하는 것이 더 낫다는 것을 읽었습니다.

 if (somecall() == -1) {
      printf("somecall() failed\n");
      if (errno == ...) { ... }
      }

위 코드에서 printf()오류가 발생하면 함수 호출이 값을 덮어쓸 수 있습니다.errnoprintf()

질문 2: 위의 내용은 시스템 호출에도 적용되며 perror()오류 strerror()도 발생할 수 있습니다.

errnoRichard Stevens의 "UNIX 환경의 고급 프로그래밍"에서 함수의 반환 값이 오류 발생을 나타낼 때만 함수 값을 확인해야 한다는 내용을 읽었습니다. 왜인지 이해가 안 돼요?

답변1

관례적으로 우리는 errno오류가 발생할 때만 변수를 확인합니다(예: -1을 반환하는 일부 함수).

errno질문 1: 그러면 프로그램을 시작하기 전에 0으로 설정하면 어떻게 되나요?

실제로는 errno오류가 발생한 상황만 확인해야 합니다. 이는 errno오류가 발생하지 않은 경우(예: 라이브러리 호출 실행 중에 오류가 발생했지만 복구된 경우) 여전히 0이 아닌 값을 포함할 수 있기 때문입니다 .

따라서 errno"프로그램 시작" 전에 0으로 설정할 필요가 없으며 이 조언을 따르지 않습니다.

자세한 내용은 오류 번호를 로컬 변수에 저장한 다음 확인하는 것이 더 낫다는 것을 읽었습니다.

예! printf()파괴할 수 있다는 당신의 관찰은 errno정확합니다. 해당 값을 보존해야 하는 경우 오류가 발생한 후 가능한 한 빨리 로컬 변수에 복사해야 합니다.

질문 2: 위의 설명이 perror() 및 strerror()에도 적용됩니까? 둘 다 시스템 호출이고 오류도 발생할 수 있기 때문입니다.

perror()수정된 내용이 호출되지 않을 수도 있지만 errno, 그렇다면 errno그렇게 하기 전에 값을 복사하도록 주의해야 합니다. 나는 그것이 perror()당신의 시스템에서 잘 작동할 것이라고 생각할 수 있다고 믿습니다 !

strerror()에러번호를 파라미터로 받기 때문에 걱정할 필요가 없고, 소멸되더라도 errno이전 값은 그대로 저장됩니다.

errnoRichard Stevens의 "UNIX 환경의 고급 프로그래밍"에서 함수의 반환 값이 오류 발생을 나타낼 때만 함수 값을 확인해야 한다는 내용을 읽었습니다. 왜인지 이해가 안 돼요?

실패 시 설정된 시스템 호출 및 라이브러리 호출은 errno성공 시 설정할 필요가 없으므로 이전 값을 유지합니다.

답변2

질문 1에 답하려면,errno프로그램 시작 부분에서 왜 0으로 설정합니까?errno어떤 시점에서 일부 바보는 이전 시스템 호출이 실패했는지 확인하지 않고 프로그램을 수정하고 해당 값을 사용할 수 있다는 것입니다 ( errno실패 시에만 설정되고 성공 시 0으로 재설정되지 않음).

perror()그리고 strerror()아니요라이브러리 함수인 시스템 호출. errno호출 시 원래 값을 유지하도록 주의를 기울입니다 . ( strerror()실제로는 매크로( )일 수 있으므로 #define유효한 값이 있는 경우에만 호출해야 합니다.)errno

관련 정보