У меня есть приложение, которое создает несколько экземпляров (процессов) самого себя, и эти процессы имеют общую структуру данных. В этой структуре есть файловый дескриптор, используемый для записи данных в файл. Существует проверка функции регистрации, которая проверяет, является ли дескриптор файла равным -1, и если это тогда, он открывает файл и устанавливает значение дескриптора общего файла.Процессы и общий файловый дескриптор
Другие процессы/потоки выполняют одну и ту же проверку, но в это время fd равно! = -1. Таким образом, файл не открывается. Затем они продолжают записывать файл. Запись не выполняется большую часть времени и возвращает -1. Когда запись не сработала, я проверил путь к файлу fd с помощью readlink. Путь был другим файлом, кроме файла журнала.
Я предполагаю, что это связано с тем, что хотя значение дескриптора файла всегда равно 11, даже в последующих прогонах это значение относится к другому файлу для каждого процесса. Итак, одиннадцатый файл открыт? Поэтому файл журнала даже не считается открытым для этих процессов, и даже если они открывают файл, fd будет отличаться.
Так что мой вопрос в том, что это правильно? Мой второй вопрос заключается в том, как я затем повторно реализую этот метод, учитывая, что в этот файл журнала необходимо записать несколько процессов. Будет ли каждый процесс открыть этот файл .. или есть другой способ, который является более эффективным .. мне нужно закрыть файл, чтобы другие процессы могли открывать и писать на него ..?
EDIT:
Программное обеспечение представляет собой программное обеспечение с открытым исходным кодом под названием filebench. Файл можно увидеть here.
Метод журнала - filebench_log. Строка 204 - это первая проверка, о которой я упоминал, где файл открыт. Запись происходит на линии 293. Значение fd составляет одиннадцать из всех процессов, и значение одно и то же: 11. Фактически он используется всеми процессами и обычно настраивается here. Файл открывается только один раз (проверяется с помощью операторов печати).
Общая структура данных, которая имеет ФД называется
filebench_shm
и ФД
filebench_shm->shm_log_fd
EDIT 2: сообщение об ошибке, что я получаю Плохой дескриптор файла. Errno - 9.
EDIT 3: Таким образом, кажется, что каждый процесс имеет другую таблицу индексов для fds. Wiki:
On Linux, the set of file descriptors open in a process can be accessed under the path /proc/PID/fd/, where PID is the process identifier.
Так что вопрос, который я имею, что для двух процессов с процессом идентификаторы 101, 102 дескриптор файла 11 не то же самое для двух процессов:
/proc/101/fd/11
/proc/102/fd/11
I есть общая структура данных между этими процессами .. есть ли другой способ я могу открыть открытый файл между ними, кроме fd, поскольку это не работает?
"* Не удается записать большую часть времени и возвращает -1 *", а 'errno' установлено на какое значение? – alk
"* создает несколько экземпляров *" как? – alk
Некоторый код был бы полезен. Обратите внимание, однако, что, если вы не разместили структуру в общей памяти, она не * разделяется между несколькими процессами. Когда вы создаете дочерние процессы, каждый получает свою собственную * копию *. Всего остального (предполагая, что вы начинаете новые копии с помощью 'fork()' ing). –