next up previous contents
Next: Структура flock Up: Блокировка файлов. Previous: Блокировка файлов.   Contents

Необходимость блокировки.

Одной из проблем при организации параллельного доступа к файлам из нескольких процессов является непредсказуемость порядка доступа в файл. В следующем примере два процесса записывают в файл строку символов по одному символу (рис. 14):

#include <stdio.h>

#include <fcntl.h>

#include <sys/types.h>

#include <sys/stat.h>

 

int main()

{

  int fd;

  int x,y;

  pid_t pid;

  unlink("/tmp/file"); /*Удаляем предыдущий файл*/

  fd=open("/tmp/file", O_WRONLY|O_CREAT, 0777);

  if(fd==-1)

  {

    perror("open : ");

    exit(0);

  }

  if((pid=fork()) == -1)

  {

    perror("fork :");

    exit(0);

  }

  else if(pid)

  { /*Родительский процесс*/

    while(1)

    {

      for(x=0; x<10; x++){

      sleep(1);

      write(fd,(char *)"x",1);

    }

  break;

  }

  else

  { /*Процесс-потомок*/

    while(1)

    {

      for(y=0; y<10; y++){

      sleep(1);

      write(fd,(char *)"X",1);

    }

    break;

  }

return 0;

}

Рис. 14. Параллельная запись в файл.

После отработки этой программы содержимое файла ``/tmp/file'' может быть следующим:

XxxXXxxXXxxXXxxXXxx
Для хранения данных предпочтительнее было бы, чтобы каждый процесс писал свои данные в отдельную часть файла. При этом содержимое файла "/tmp/file" должно быть следующим:

xxxxxxxxxxXXXXXXXXXX
Для разделения данных в файле используется функция:

int fcntl(int fd, int сommand,.../*struct flock *flockptr*/);



2003-12-09