2010-04-18 5 views
6

У меня есть многопоточное приложение, которое открывает и читает один и тот же файл (не записывая). Я открываю другой файловый дескриптор для каждого потока (но все они указывают на тот же файл). Каждый поток затем считывает файл и может закрывать его и снова открывать, если EOF достигнут. Это нормально? Если я выполняю fclose() в файловом дескрипторе, это влияет на другие дескрипторы файлов, указывающие на один и тот же файл?Несколько дескрипторов файлов в один и тот же файл, C

ответ

3

Это нормально. Вы можете открыть все время, когда хотите, чтобы тот же файл и каждый дескриптор файла были независимы друг от друга.

0

Это должно работать нормально, если каждый поток имеет свой собственный дескриптор файла. Поскольку вы упоминаете использование fclose(), это говорит о том, что вы используете fopen() в каждом потоке, и каждый поток влияет только на собственную переменную FILE *.

Есть ли проблема?

+0

В принципе, я создал 2-мерный массив указателей файлов (потому что каждый поток будет читать, скажем, x-файлы), в общей сложности для y потоков. поэтому мой массив FILE * - это массив [y] [x]. Для данного потока i я открываю файл через fopen (array [i] [0]), например (для файла 0). Затем я читаю (fread) файл (не все одновременно) и выполняю другие задачи (при этом не записывается файл). Во время чтения, если EOF достигнут, я снова закрою, а затем снова откроюсь. Моя забота заключалась в том, что когда я буду fclose и fopen, могу ли я каким-либо образом повлиять на другие указатели FILE * из других потоков, которые указывают на один и тот же файл, который я выполнил f закрыть o – Gigi

+0

Предполагая, что ваш 'fopen()' является опечаткой (это должно быть 'array [i] [0] = fopen' ...), то да, это будет работать нормально. Если каждый поток не обрабатывает данные, принадлежащие другим потокам. – wallyk

+0

Спасибо. Да, все потоки делают с этими файлами: fopen(), fread() и fclose(). – Gigi

3

Для систем Linux для этого вам не требуется несколько файловых дескрипторов. Вы можете поделиться одним файловым дескриптором и использовать pread для атомарного выполнения операции поиска/чтения без изменения файлового дескриптора вообще.

+0

'pread' - это POSIX, поэтому он не ограничен Linux. –