Блокировка файла на запись/чтение - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Здравствуйте. Решаю задачу организации работы двух параллельных процессов с файлом. Для начала, чтобы прочувствовать тему, решил обойтись без блокировок, ограничений и т.д.
#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;
}
Очевидно, что порой работа читающего процесса нарушается (при каждом запуске программа выдает разные последовательности диагностических сообщений) (интересно, кстати, почему не нарушается в таком случае работа пишущего процесса - пишется в файл все, что нужно, и в нужном количестве). Решаю реализовать блокировку. Цель - 100%-успешная работа читающего процесса.
...
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.

Объяснение кода листинга программы

  1. Включаем заголовочный файл <sys/file.h>
  2. Определяем функцию flock, которая принимает два аргумента: int fd, int operation
  3. Функция применяет или удаляет условную блокировку на открытом файле, указанном в fd
  4. Аргумент operation может принимать одно из трех значений: LOCK_SH, LOCK_EX, LOCK_UN
  5. LOCK_SH устанавливает разделяемую блокировку. Несколько процессов могут удерживать разделяемую блокировку на один и тот же файл одновременно.
  6. LOCK_EX устанавливает эксклюзивную блокировку. Только один процесс может удерживать эксклюзивную блокировку на файл одновременно.
  7. LOCK_UN удаляет существующую блокировку, удерживаемую этим процессом.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 3.875 из 5