У меня есть многопоточная программа в CPP, в которой есть функция ведения журнала, которая используется во всем коде. Файл журнала открывается в основной функции с помощью fopen(), и эта функция ведения журнала записывает в него строку, переданную функции ведения журнала. Также функция проверяет размер файла. Если оно больше некоторого значения, он закрывает файл с помощью fclose() и открывает новый файл с помощью fopen(). Вопрос здесь в том, что я видел эту ошибку в журналах valgrind «неверный файловый дескриптор -1 в системном вызове write ()». Я хочу знать, каковы возможные причины того, что значение дескриптора файла становится -1. Я также наблюдал ошибку «Недопустимое чтение/запись» в строках, где выполняется любая операция с дескриптором открытого файла. Это заставляет меня чувствовать, что именно это значение дескриптора файла может вызывать эту ошибку. Любые подсказки будут высоко оценены.
Когда значение дескриптора файла становится равным -1?
Ответы (2)
Если несколько потоков используют один и тот же ФАЙЛ*, то вы можете столкнуться с рядом проблем, если не будет блокировки всех вызовов fopen, fclose и fwrite. Пока вы повторно открываете файл, может быть другой поток, пытающийся записать в него. fwrite также выполняет запись в буфер, и несколько потоков, работающих с буфером, могут привести к повреждению памяти.
Посмотрите на открытую справочную страницу
--- вырезка из справочной страницы ---------
RETURN VALUE
open() and creat() return the new file descriptor, or -1 if an error occurred (in which case, errno is set appropriately).
Очевидно, что ваш код не проверяет состояние ошибки в дескрипторе файла (-1) и продолжает чтение/запись, поэтому вы видите ошибку.
Изменить (пояснение относительно fopen)
Каждый открываемый вами файл связан с файловым дескриптором (независимо от того, используете ли вы fopen). Valgrind отслеживает трассировки ваших системных вызовов (чтение/запись). FILE* — это всего лишь оболочка над файловым дескриптором. Таким образом, сообщения об ошибках, связанные с "-1" fd, по-прежнему указывают на то, что вы читаете/записываете в недопустимый файл (возможно, ваш процесс исчерпал максимальное количество fd для выделения) и т. д. Чтобы понять это, я бы рекомендовал выполнить системный вызов трассировка вашего процесса с помощью "strace". вы увидите, что "fopen" (API уровня пользователя/библиотеки) внутренне вызывает "open" (системный вызов).
Надеюсь, поможет!