[FONT=Tahoma]#include <fcntl.h>[/FONT]
[FONT=Tahoma]int fcntl(int fd, int cmd, struct flock *lock);[/FONT]
[FONT=Tahoma]...[/FONT]
Как нескольким пользователям читать/писать из/в общего/общий файла/файл?
Как открыть файл, если он открыт другим пользователем, и прочитать из него или записать в него данные???
Цитата: Vitaliy Boberman
Как открыть файл, если он открыт другим пользователем, и прочитать из него или записать в него данные???
Для решения этой задачи была придумана база данных...
открыл Америку.... :(
[FONT=Tahoma]Если несколько процессов одновременно хотят работать с одним файлом, они должны это делать согласованно. Для этого применяется механизм блокирования файлов. Это блокирование носит рекомендательный характер, то есть при установленных блокировках можно работать с файлом. Но не нужно. [/FONT]
[FONT=Tahoma]Общий принцип использования общего файла несколькими процессами: каждый из процессов должен[/FONT]
[FONT=Tahoma]-Установить блокировку на соответствующую операции (если блокировку установить невозможно, значит файл уже занят другим процессом. Текущий процесс будет спать до освобождения файла)[/FONT]
[FONT=Tahoma]-Произвести операцию[/FONT]
[FONT=Tahoma]-Снять блокировку[/FONT]
[FONT=Tahoma]Для установки, ожидания разблокирования файла и снятия блокировки используется функция fcntl:[/FONT]
Код:
[FONT=Tahoma]1) fd - файловый дескриптор[/FONT]
[FONT=Tahoma]2) cmd - команда (F_GETLK - позволяет проверить наличие указанных в структуре lock блокировок, если они невозможны в данный момент, то структура lock изменяется в соответствии с существующими блокировками; F_SETLK - устанавливает указанные в структуре lock блокировки, если невозможно, возвращается номер ошибки; F_SETLKW - устанавливает блокировки, если невозможно, то процесс засыпает до появления возможности блокировки)[/FONT]
[FONT=Tahoma]3) lock - структура[/FONT]
[FONT=Tahoma]Поля структуры:[/FONT]
Код:
[FONT=Tahoma]struct flock[/FONT]
[FONT=Tahoma]{[/FONT]
[FONT=Tahoma]short l_type; /*тип блокирования: F_RDLCK - чтение[/FONT]
[FONT=Tahoma] F_WRLCK - записи[/FONT]
[FONT=Tahoma] F_UNLCK - снятие */[/FONT]
[FONT=Tahoma]short l_whence; /*точка отсчета блокируемой записи: [/FONT]
[FONT=Tahoma] SEEK_SET - начало,[/FONT]
[FONT=Tahoma] SEEK_END - конец,[/FONT]
[FONT=Tahoma] SEEK_CUR – текущее[/FONT]
[FONT=Tahoma] положение указателя чтения-записи*/[/FONT]
[FONT=Tahoma]off_t l_start; /*смещение блокируемой записи относительно [/FONT]
[FONT=Tahoma] точки отсчета */[/FONT]
[FONT=Tahoma]off_t l_len; /*длина блокируемой записи, [/FONT]
[FONT=Tahoma] l_len==0 - до конца файла*/[/FONT]
[FONT=Tahoma]pid_t pid; /*pid процесса, который установил блокирование*/[/FONT]
[FONT=Tahoma]}[/FONT]
[FONT=Tahoma]{[/FONT]
[FONT=Tahoma]short l_type; /*тип блокирования: F_RDLCK - чтение[/FONT]
[FONT=Tahoma] F_WRLCK - записи[/FONT]
[FONT=Tahoma] F_UNLCK - снятие */[/FONT]
[FONT=Tahoma]short l_whence; /*точка отсчета блокируемой записи: [/FONT]
[FONT=Tahoma] SEEK_SET - начало,[/FONT]
[FONT=Tahoma] SEEK_END - конец,[/FONT]
[FONT=Tahoma] SEEK_CUR – текущее[/FONT]
[FONT=Tahoma] положение указателя чтения-записи*/[/FONT]
[FONT=Tahoma]off_t l_start; /*смещение блокируемой записи относительно [/FONT]
[FONT=Tahoma] точки отсчета */[/FONT]
[FONT=Tahoma]off_t l_len; /*длина блокируемой записи, [/FONT]
[FONT=Tahoma] l_len==0 - до конца файла*/[/FONT]
[FONT=Tahoma]pid_t pid; /*pid процесса, который установил блокирование*/[/FONT]
[FONT=Tahoma]}[/FONT]
[FONT=Tahoma]Пример "Блокирование файлов для записи":[/FONT]
Код:
[FONT=Tahoma]...[/FONT]
[FONT=Tahoma]struct flock lock;[/FONT]
[FONT=Tahoma]...[/FONT]
[FONT=Tahoma]lock.l_type = F_WRLCK;[/FONT]
[FONT=Tahoma]lock.l_whence = SEEK_SET;[/FONT]
[FONT=Tahoma]lock.l_start = 0;[/FONT]
[FONT=Tahoma]lock.l_len = 0;[/FONT]
[FONT=Tahoma]fcntl(fd, F_SETLKW, &lock); /*установка блокировки для записи*/[/FONT]
[FONT=Tahoma]write(fd, record, sizeof(record)); /*запись*/[/FONT]
[FONT=Tahoma]lock.l_type = F_UNLCK;[/FONT]
[FONT=Tahoma]fcntl(fd, F_SETLKW, &lock); /*снятие блокировки*/[/FONT]
[FONT=Tahoma]...[/FONT]
[FONT=Tahoma]struct flock lock;[/FONT]
[FONT=Tahoma]...[/FONT]
[FONT=Tahoma]lock.l_type = F_WRLCK;[/FONT]
[FONT=Tahoma]lock.l_whence = SEEK_SET;[/FONT]
[FONT=Tahoma]lock.l_start = 0;[/FONT]
[FONT=Tahoma]lock.l_len = 0;[/FONT]
[FONT=Tahoma]fcntl(fd, F_SETLKW, &lock); /*установка блокировки для записи*/[/FONT]
[FONT=Tahoma]write(fd, record, sizeof(record)); /*запись*/[/FONT]
[FONT=Tahoma]lock.l_type = F_UNLCK;[/FONT]
[FONT=Tahoma]fcntl(fd, F_SETLKW, &lock); /*снятие блокировки*/[/FONT]
[FONT=Tahoma]...[/FONT]
З.Ы.: это все для Unix'a..
И вообще не уверен, что тебе нужно именно это!
Сформулируй поконкретнее!!
Есть такие флаги как:
CFile::shareDenyNone
CFile::shareDenyRead
CFile::shareDenyWrite
CFile::shareExclusive
Думаю при небольшом знании английского догадаться о их назначении можно.
ага, спасибо! я тут еще надыбал MapViewOfFile...