Linux의 libc에서 strerror_r 함수를 사용하고 있습니다. 버퍼 포인터 및 버퍼 크기 인수 0 호출하고 오류 메시지가있는 문자열 포인터를 반환합니다.strerror_r 함수가 반환 한 포인터로 무엇을해야합니까?
나중에 사용할 수 있도록 문자열 복사본을 만들지 만 반환 된 포인터를 어떻게 처리해야합니까? 어떤 방법 으로든이 포인터를 해제해야합니까, 아니면 정적 메시지 테이블을 가리켜 야합니까?
Linux의 libc에서 strerror_r 함수를 사용하고 있습니다. 버퍼 포인터 및 버퍼 크기 인수 0 호출하고 오류 메시지가있는 문자열 포인터를 반환합니다.strerror_r 함수가 반환 한 포인터로 무엇을해야합니까?
나중에 사용할 수 있도록 문자열 복사본을 만들지 만 반환 된 포인터를 어떻게 처리해야합니까? 어떤 방법 으로든이 포인터를 해제해야합니까, 아니면 정적 메시지 테이블을 가리켜 야합니까?
strerror_r
의 (GNU, Posix가 아닌) 버전에 의해 반환 된 문자열은 항상 정적 문자열이거나 사용자가 제공 한 버퍼입니다. 거의 항상 정적 문자열입니다. 오류 문자열은 errno
의 값을 알 수없는 경우에만 동적으로 작성됩니다.
버퍼 크기를 0으로 지정하면 버퍼가 사용되지 않습니다. 귀하의 경우에는 strerror_r
을 호출 한 결과로 0이 수신 될 수 있음을 의미하므로 여전히 반환됩니다. 아마 당신이 의도 한 것이 아닙니다.
항상 strerror_r
의 POSIX의 버전은 사용자가 제공하는 버퍼를 사용하고, 일부 오류가 오류가 될 버퍼의 부족 (발생하지 않으면 0을 반환, 그래서 당신은 POSIX의 버전 0으로 버퍼를 지정하는 경우, 당신은있어 부작용으로 - -됩니다 오류 리턴 얻을 보장 errno
의 이전 값을 파괴를 한마디로
:. 0의 버퍼 길이 strerror_r
를 호출
이 올바르지 않습니다 , 비록 당신이 Gnu 특정 그 기능의 버전, 대다수의 시간은 중요하지 않습니다.
버퍼가 아닌 경우 문자열을 복사 할 필요가 없습니다. Strerror_r의 Posix 호환 버전에서는 정적 문자열이 사용 가능한지 여부를 알 수 없으므로 항상 버퍼를 복사하게됩니다.
라이브러리의 버전을 어떻게 알 수 있습니까? 나는 "libc.so.6"에 동적으로 링크되어 있으며 "strerror_r"함수를 가져옵니다. 모든 경우에 함수에서 반환 된 포인터를 해제 할 필요가 없다는 것을 정확히 이해 했습니까? – johnfound
@johnfound : 문자열을 반환하는 경우 Gnu 버전입니다. 당신이 얻는 것은 당신이 제공하는 기능 테스트 매크로에 달려있다. 'man strerror'와'man feature-test-macros'를보십시오. 반환 된 포인터를 해제하는 것은 오류입니다. 두 번째 인수로 0을 제공하는 것도 오류입니다. – rici