Блокировка файла на запись/чтение - 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 удаляет существующую блокировку, удерживаемую этим процессом.