Как вы боретесь со следующей ситуацией?
Либо делай fflush() на каждой записи, либо лови креш и делай fflush() перед выходом.
>лови креш и делай fflush() перед выходом.
так лучше
Благодарю! Пока сделал для каждой записи, помогло.
А как корректно ловить креш для неопределённого участка кода?
На тот случай, если на каком-то компьютере по непонятной причине вылетит та или иная библиотека.
seh
Daniil Petrov
> Поможет ли это моему горю, особенно если запись происходит из нескольких
> потоков, бывает что одновременно?
кто мешает mutex использовать ? точнее critical section
innuendo
> seh
издеваешься : )
я бы подсказал повесить backtrace() на SIGSEGV, но чую автор на винде и не под cygwin/mingw/msys2/WSL
Sh.Tac.
> я бы подсказал повесить backtrace() на SIGSEGV, но чую автор на винде и не под cygwin/mingw/msys2/WSL
Да-да :) Винда проклятая
Sh.Tac.
> я бы подсказал повесить backtrace() на SIGSEGV, но чую автор на винде и не под
> cygwin/mingw/msys2/WSL
Ну пусть вешает AddVectoredExceptionHandler, делов-то:
Daniil Petrov
> Поможет ли это моему горю, особенно если запись происходит из нескольких
> потоков, бывает что одновременно?
по умолчанию fwrite потокобезопасен, поэтому если ты тупо просто один раз вызываешь fwrite с записью в конец файла, то нет смысла дополнительно еще синхронизировать функцию лога. Если же ты пытаешься записать мелкими порциями за раз тогда вешай mutex и записывай в свой внутренний буфер, а когда придет время завершать программу запишешь все одним махом. Либо дергать каждый раз потоко не безопасные варианты если они имеются (для случай когда у тебя свой mutex guard).
Aroch
> а когда придет время завершать программу запишешь все одним махом
иногда бывает нужно смотреть лог во время работы, а не после :)
innuendo
> иногда бывает нужно смотреть лог во время работы, а не после :)
во время работы проще тогда уж сокет открыть и отправлять чем насиловать винты.
Aroch
> по умолчанию fwrite потокобезопасен, поэтому если ты тупо просто один раз
> вызываешь fwrite с записью в конец файла, то нет смысла дополнительно еще
> синхронизировать функцию лога.
Именно так и делаю, вопрос был в том, что при вылете приложения многое в файл не записивалось, пришлось выполнять ещё каждый раз и fflush.
Потом отдельно подумаю, как его красивее выполнять, чтоб не при каждой записи и одновременно не терять всё, что как бы записалось, но отлетает перед вылетом приложения.
Открыл, записал, закрыл и никаких проблем.
Daniil Petrov
тебе уже сказали, перехватывай segfault и обрабатывай в нем, нет большого смысла каждый раз делать fflush()
https://habr.com/post/131412/
Тема в архиве.