Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как нескольким пользователям читать/писать из/в общего/общий файла/файл?

10K
27 ноября 2006 года
Vitaliy Boberman
34 / / 24.10.2006
Как открыть файл, если он открыт другим пользователем, и прочитать из него или записать в него данные???
5.4K
28 ноября 2006 года
Svyatozar
221 / / 11.09.2006
Цитата: Vitaliy Boberman
Как открыть файл, если он открыт другим пользователем, и прочитать из него или записать в него данные???

Для решения этой задачи была придумана база данных...

10K
28 ноября 2006 года
Vitaliy Boberman
34 / / 24.10.2006
открыл Америку.... :(
263
28 ноября 2006 года
koltaviy
816 / / 16.12.2004
[FONT=Tahoma]Может это поможет:[/FONT]
[FONT=Tahoma]Если несколько процессов одновременно хотят работать с одним файлом, они должны это делать согласованно. Для этого применяется механизм блокирования файлов. Это блокирование носит рекомендательный характер, то есть при установленных блокировках можно работать с файлом. Но не нужно. [/FONT]
[FONT=Tahoma]Общий принцип использования общего файла несколькими процессами: каждый из процессов должен[/FONT]
[FONT=Tahoma]-Установить блокировку на соответствующую операции (если блокировку установить невозможно, значит файл уже занят другим процессом. Текущий процесс будет спать до освобождения файла)[/FONT]
[FONT=Tahoma]-Произвести операцию[/FONT]
[FONT=Tahoma]-Снять блокировку[/FONT]

[FONT=Tahoma]Для установки, ожидания разблокирования файла и снятия блокировки используется функция fcntl:[/FONT]
 
Код:
[FONT=Tahoma]#include <fcntl.h>[/FONT]
[FONT=Tahoma]int fcntl(int fd, int cmd, struct flock *lock);[/FONT]
[FONT=Tahoma]...[/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 &#8211; текущее[/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]

З.Ы.: это все для Unix'a..
И вообще не уверен, что тебе нужно именно это!
Сформулируй поконкретнее!!
22K
28 ноября 2006 года
phobos[UA]
9 / / 28.11.2006
Если ты имееш ввиду случай когда одна прога открыла файлик, например для чтения, а другая прога открыть его может, то тебе может помочь класс CFile а в частности параметр nOpenFlags в конструкторе или методе Open.
Есть такие флаги как:
CFile::shareDenyNone
CFile::shareDenyRead
CFile::shareDenyWrite
CFile::shareExclusive
Думаю при небольшом знании английского догадаться о их назначении можно.
10K
29 ноября 2006 года
Vitaliy Boberman
34 / / 24.10.2006
ага, спасибо! я тут еще надыбал MapViewOfFile...
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог