Странное значение смещения в fwrite

В целях отслеживания вызовов ввода-вывода я перезаписал fwrite в разделяемой библиотеке, которую я LD_PRELOAD при запуске программы. В моей версии fwrite я получаю абсолютное смещение записи, используя

long int pos = ftell(stream);

Затем значение передается функции, которая принимает аргумент size_t (т. е. unsigned long), и значение печатается.

Я столкнулся с некоторыми вызовами со смещением 18446744073709551615 (2 ^ 64 - 1), поэтому я предполагаю, что начальный длинный int, возвращаемый ftell, был -1. Эти операции всегда записывают 10 байт.

Итак, мой вопрос: что могло привести к тому, что смещение потока было установлено на -1?

Я не отслеживаю имена файлов, к которым обращаются эти странные fwrite, поэтому я не знаю, к чему обращаются. Также я должен уточнить, что программа является программой MPI. Возможно, задействованный поток на самом деле является сокетом или чем-то еще, кроме файла...


person sunmat    schedule 06.03.2014    source источник
comment
что было установлено errno?   -  person Sakthi Kumar    schedule 06.03.2014
comment
stream невозможность поиска (например, сокет, канал, ...) действительно приведет к тому, что ftell() вернет -1 (ошибка должна быть EBADF в этом случае)   -  person Ingo Leonhardt    schedule 06.03.2014
comment
Так что я думаю, что это ответ. Спасибо! Добавлю тест, что файл обычный. Кто-то действительно должен сказать мне, как пометить вопрос как отвеченный, когда кто-то публикует ответ в комментарии, а также...   -  person sunmat    schedule 06.03.2014


Ответы (1)


Значение -1, возвращаемое командой ftell, означает, что была установлена ​​ошибка errno. Вот текст relivenat со страницы руководства:

ftell() возвращает текущее смещение. В противном случае возвращается -1 и устанавливается значение errno, указывающее на ошибку.

person problemPotato    schedule 06.03.2014