2014-03-06 2 views
0

I/O 호출을 추적하기 위해 프로그램을 실행할 때 I LD_PRELOAD 인 공유 라이브러리에 fwrite을 덮어 썼습니다. fwrite 내 버전에서, I는 size_t로 인수 (긴 그래서 부호)를 취하는 함수로 전달된다fwrite의 오프셋에 이상한 값

long int pos = ftell(stream); 

값을 사용하여 기록 오프셋 절대치를 얻고,이 값은 출력된다.

오프셋 (2^64 - 1)으로 18446744073709551615를 호출하는 일부 호출이 발생 했으므로 ftell에서 반환 한 최초의 long int는 -1이었습니다. 이러한 작업은 항상 10 바이트를 썼습니다.

내 질문은 : 무엇이 스트림 오프셋을 -1로 설정할 수 있었습니까?

이상한 fwrites에서 액세스하는 파일의 이름을 추적하지 않기 때문에 액세스되는 항목을 알 수 없습니다. 또한이 프로그램이 MPI 프로그램이라는 사실을 명확히해야합니다. 관련된 스트림이 실제로는 소켓이거나 파일이 아닌 다른 것일 수 있습니다 ...

+0

무엇이'errno'로 설정 되었습니까? –

+0

'stream'이 탐색 할 수 없다면 (예 : 소켓, 파이프 등)'ftell()'이 -1을 반환합니다 (thar의 경우'errno는'EBADF' 여야합니다). –

+0

그래서 이것이 답입니다. 감사! 파일이 일반 파일인지 테스트를 추가하겠습니다. 어떤 사람은 정말로 다른 사람이 댓글에 답글을 올렸을 때 답을 표시하는 법을 말해야합니다. – sunmat

답변

0

-1 반환 값은 ftr에서 errno가 설정되었음을 의미합니다. 다음은 맨 페이지의 relivenat 텍스트입니다.

ftell()은 현재 오프셋을 반환합니다. 그렇지 않으면 -1이 리턴되고 errno는 오류를 나타내도록 설정됩니다.