[<<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).