[<<Previous Entry] [^^Up^^] [Next Entry>>] [Menu] [About The Guide]
 Решения упражнений
Защищенный текстовый редактор
lockvi.c
  1 #include <sys/types.h>
  2 #include <stdlib.h>
  3 #include <stdio.h>
  4 #include <unistd.h>
  5 #include <fcntl.h>
  6 #include <errno.h>
  7
  8 main(int argc, char *argv[])
  9 {
 10     struct flock lock;
 11     int fd;
 12     char command[100];
 13
 14     if ((fd = open(argv[1], O_RDWR)) == -1) {
 15         perror(argv[1]);
 16         exit(1);
 17     }
 18     lock.l_type = F_WRLCK;
 19     lock.l_whence = SEEK_SET;
 20     lock.l_start = 0;
 21     lock.l_len = 0; /* whole file address space */
 22     if (fcntl(fd, F_SETLK, &lock) == -1) {
 23         if ((errno == EACCES) || (errno == EAGAIN)) {
 24             printf("%s busy -- try later\n", argv[1]);
 25             exit(2);
 26         }
 27         perror(argv[1]);
 28         exit(3);
 29     }
 30
 31     sprintf(command, "vi %s\n", argv[1]);
 32     system(command);
 33
 34     lock.l_type = F_UNLCK;    /* unlock file */
 35     fcntl(fd, F_SETLK, &lock);
 36     close(fd);
 37 }

При использовании допустимого захватывания, vi может получить доступ к
файлу. vi не вызывает fcntl(2) перед чтением содержания файла. Когда
вы захватите файл, а ваш одногруппник будет исполнять вашу программу,
он достигнет успеха. При использовании обязательного захватывания,
захват записи будет проверяться перед всеми системными вызовами
read(2) и write(2). vi будет заблокировано при попытке исполнить
read(2).