2014-03-06 68 views
0

爲了跟蹤I/O調用,我在運行程序時在LD_PRELOAD共享庫中覆蓋了fwrite。在我的版本的fwrite,我得到的絕對使用fwrite中偏移量的奇怪值

long int pos = ftell(stream); 

值然後傳遞給需要的size_t參數(因此無符號長)函數寫的偏移,並打印值。

我遇到了一些調用18446744073709551615作爲偏移量(2^64 - 1),所以我猜ftell返回的初始long int是-1。這些操作總是寫10個字節。

所以我的問題是:什麼可能導致流偏移設置爲-1?

我不追蹤那些奇怪的fwrites正在訪問的文件的名稱,所以我不知道什麼被訪問。另外我應該確定該程序是一個MPI程序。有可能涉及到的流實際上是套接字,或者是其他文件...

+0

'errno'設置爲什麼? –

+0

'stream'不是可搜索的(例如套接字,管道......)確實會導致'ftell()'返回-1(在這種情況下,errno應該是'EBADF') –

+0

所以我想這是答案。謝謝!我會添加一個測試,該文件是一個常規的文件。有人應該真的告訴我,如果某人在評論中發佈答案時如何將問題標記爲答案,那麼...... – sunmat

回答

0

-1從ftell返回值意味着已設置errno。以下是手冊頁中的重新編輯文本:

ftell()返回當前的偏移量。否則,返回-1並將errno設置爲指示錯誤。