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


Пример 5.27


#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));

}




Начало  Назад  Вперед