В этом разделе мы рассмотрим методы синхронизации работы программ, основанные на блокировании файлов.
Принцип блокирования файлов достаточно прост. Например, в MS-DOS, если запущена программа SHARE.EXE, программа, открывая файл, может указать, что этот файл будет использоваться ей монопольно. При попытке открыть этот файл еще раз другая программа получит от соответствующей функции MS-DOS код ошибки.
Для открывания файлов из программы, составленной на языке программирования C (или C++), удобно использовать функцию open():
int open(const char *path, int access [, unsigned mode]);
Для использования этой функции ваша программа должна содержать следующие две строки:
#include <fcntl.h> #include <sys\stat.h>
Функция возвращает индекс (handle) открытого файла или -1 в случае ошибки.
Параметр path указывает путь к открываемому файлу.
Параметр access определяет режим доступа к открываемому файлу. Вы можете использовать символические константы (их можно объединять при помощи логической операции ИЛИ):
Константа | Значение |
O_RDONLY | Открыть файл только для чтения |
O_WRONLY | Открыть файл только для записи |
O_RDWR | Открыть файл для чтения и записи |
O_APPEND | Добавлять записываемые данные в конец файла |
O_CREAT | Создать файл и открыть его. Если файл уже существует, ничего не происходит. Если файл не существует, он создается и открывается |
O_EXCL | Этот режим используется только вместе с режимом O_CREAT. Если файл уже существует, возвращается признак ошибки |
O_TRUNC | Открыть файл и установить для него нулевую длину |
O_BINARY | Файл открывается в двоичном режиме |
O_TEXT | Файл открывается в текстовом режиме. Для него выполняется преобразование байтов CR-LF в '\n' |
O_DENYNONE | К файлу разрешен множественный доступ со стороны нескольких программ, т. е. этот файл может быть открыт несколько раз |
O_DENYALL | Этот файл может быть открыт только один раз. Если другая программа попытается открыть файл для чтения или для записи, она получит признак ошибки |
O_DENYWRITE | Другая программа не может открыть этот файл еще раз для записи, но она может открыть его для чтения |
O_DENYREAD | Другая программа не может открыть этот файл еще раз для чтения, но она может открыть его для записи |