Программирование в стандарте POSIX


         

Установим блокировку на запись на


#include
#include
#include
#include
#include
#define LOCKFILE "my_lockfile"
/* Программа устанавливает несколько блокировок */
/* на файл LOCKFILE */
int main (void) {
int fd;
struct flock lck;
assert ((fd = open (LOCKFILE, O_RDWR | O_CREAT |
O_TRUNC, S_IRWXU)) != -1);
/* Установим блокировку на запись на весь файл */
lck.l_type = F_WRLCK;
lck.l_whence = SEEK_SET;
lck.l_start = (off_t) 0;
lck.l_len = (off_t) 0;
if (fcntl (fd, F_SETLK, &lck) == -1) {
perror ("FCNTL-F_SETLK-1");
close (fd);
return (-1);
}
/* Сделаем размер файла ненулевым */
if (lseek (fd, (off_t) 1024, SEEK_SET) == -1) {
perror ("LSEEK");
close (fd);
return (-1);
}
if (write (fd, &lck, sizeof (lck)) != sizeof (lck)) {
perror ("WRITE");
close (fd);
return (-1);
}
/* Снимем блокировку в середине файла */
lck.l_type = F_UNLCK;
lck.l_whence = SEEK_SET;
lck.l_start = (off_t) 512;
lck.l_len = (off_t) sizeof (lck);
if (fcntl (fd, F_SETLK, &lck) == -1) {
perror ("FCNTL-F_SETLK-2");
close (fd);
return (-1);
}
/* Установим блокировку на чтение в конце файла */
lck.l_type = F_RDLCK;
lck.l_whence = SEEK_END;
lck.l_start = (off_t) -sizeof (lck);
lck.l_len = (off_t) sizeof (lck);
if (fcntl (fd, F_SETLK, &lck) == -1) {
perror ("FCNTL-F_SETLK-2");
close (fd);
return (-1);
}
sleep (10);
return (close (fd));
}

Содержание  Назад  Вперед