strerror() 함수는 errnum 에러에 대한 설명이 담긴 문자열에 대한 포인터를 반환한다. 문자열 내용을 애플리케이션에서 바꾸면 안 되지만, 연속해서 perror()와 strerror()를 호출하면 바뀔 수도 있다. 이런 의미에서 strerror()는 Thread Safe 하지 않다.
strerror_r() 함수는 스레드에서 사용할 수 있다. 이 함수는 buf가 가리키는 지점부터 len만큼 버퍼를 채운다. 성록하면 0을 반환하고 실패하면 -1 을 반환한다.
어떤 함수에서는 반환 타입의 전체 범위가 유효한 반환값인 경우도 있다. 이런 경우 호출 전에 errno를 0으로 초기화한 후에 함수를 호출하여 errno를 검사한다.
흔히 하는 실수로, 라이브러리나 시스템 콜에서 errno 값을 바꿀 수 있다는 사실을 잊은 채 errno 값을 검사하는 경우가 있다. 예를 들어 다음 코드는 버그가 있다.
만일 함수를 여러 번 호출하면서 errno 값을 보존해야 한다면 다른 곳에 따로 저장하자.
싱글 스레드 프로그램에서 errno는 전역 변수이지만, 멀티 스레드 프로그램에서 errno는 스레드 별로 저장되므로 스레드에서 사용이 가능하다.