Блокировка файла на запись/чтение - C (СИ)
Формулировка задачи:
Здравствуйте.
Решаю задачу организации работы двух параллельных процессов с файлом. Для начала, чтобы прочувствовать тему, решил обойтись без блокировок, ограничений и т.д.
Очевидно, что порой работа читающего процесса нарушается (при каждом запуске программа выдает разные последовательности диагностических сообщений) (интересно, кстати, почему не нарушается в таком случае работа пишущего процесса - пишется в файл все, что нужно, и в нужном количестве).
Решаю реализовать блокировку. Цель - 100%-успешная работа читающего процесса.
А воз и ныне там. Надо полагать, я слишком наивен, думая, что блокировка реализуется именно таким образом?
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> #include <sys/stat.h> int i,j,fd; char buf; int main(int argc, char *argv) { if (argc == 1) { printf("Please input filename\n"); exit(-1); } if (fork()) { if ((fd = open(argv[1], O_WRONLY | O_CREAT, 0755)) < 0) { printf("Can't open file for writing\n"); exit(-1); } for (j = 0; j < 4; ++j) { for (i = 0; i < 62; ++i) { buf = 'A' + i; if (write(fd, &buf, 1)<=0) { printf("Can't write in the file\n"); } } } close(fd); } else { if ((fd = open(argv[1], O_RDONLY | O_CREAT, 0755))<0) { printf("Can't open file for reading\n"); exit(-1); } while(read(fd, &buf, 1)) { printf("Symbol %s was successfully read\n", buf); } close(fd); } return 0; }
... struct flock lck; ... // В пишущем процессе lck.l_type = F_WRLCK; lck.l_whence = SEEK_SET; lck.l_len = 0; while(fcntl(fd, F_SETLK, &lck)<0) { printf("Blocking error\n"); } ...
Решение задачи: «Блокировка файла на запись/чтение»
textual
Листинг программы
#include <sys/file.h> int flock(int fd, int operation); DESCRIPTION Apply or remove an advisory lock on the open file specified by fd. The argument operation is one of the following: LOCK_SH Place a shared lock. More than one process may hold a shared lock for a given file at a given time. LOCK_EX Place an exclusive lock. Only one process may hold an exclusive lock for a given file at a given time. LOCK_UN Remove an existing lock held by this process.
Объяснение кода листинга программы
- Включаем заголовочный файл <sys/file.h>
- Определяем функцию flock, которая принимает два аргумента: int fd, int operation
- Функция применяет или удаляет условную блокировку на открытом файле, указанном в fd
- Аргумент operation может принимать одно из трех значений: LOCK_SH, LOCK_EX, LOCK_UN
- LOCK_SH устанавливает разделяемую блокировку. Несколько процессов могут удерживать разделяемую блокировку на один и тот же файл одновременно.
- LOCK_EX устанавливает эксклюзивную блокировку. Только один процесс может удерживать эксклюзивную блокировку на файл одновременно.
- LOCK_UN удаляет существующую блокировку, удерживаемую этим процессом.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д