Приклад. 1. Для установки блокування ми заповнюємо поля структури flock необхідними значеннями і викликаємо fcntl() з командою F_SETLK (встановити блокування):

1. Для установки блокування ми заповнюємо поля структури flock необхідними значеннями і викликаємо fcntl() з командою F_SETLK (встановити блокування):

..

struct flock fi;

fd=open(file, O_RDWR);

fi.l_type = F_WRLCK;

fi.l_whence = SEEK_SET;

fi.l_start = 0;

fi.l_len = 64;

off = 0;

while (fcntl(fd, F_SETLK &fi)== -1)

{ fcntl(fd, F_GETLK & fi);

...

printf("байти %i - %i заблоковані процесом %i\n", off, off+64

fi.l_pid);

}

 

Якщо задана область вже заблокована, fcntl повертає -1. За допомогою команди F_GETLK можна дізнатися, ідентифікатор процесу, що заблокував дану область.

 

2. Для того, щоб зняти блокування, ми викликаємо fctnl() з командою F_SETLK (дивно, чи не так?) і параметром l_type = F_UNLCK:

fi.l_type = F_UNLCK;

if (fcntl(fd, F_SETLK &fi)== -1)

printf("Помилка разблокирования\n");

5. Індівідуальні завдання

1. Написати програму, яка виводить дату і час останньої зміни файлу. Ім'я файлу задавати у вигляді аргументу командного рядка. Перевіряти, чи не виникають помилки при системних викликах.

2. Написати функцію, що додає право на читання файлу всім категоріям користувачів. Аргументом є колійне ім'я файлу. Функція повертає значення 0, якщо операція вдалася, і -1 в іншому випадку

3. Написати функцію, що визначає власника файлу. Аргументом функції є колійне ім'я файлу. Функція повертає ідентифікатор власника, у випадку успіху і -1 в іншому випадку.

4. Написати програму, що додає право читання файлу всім категоріям користувачів для декількох файлів. Імена файлів задавати у вигляді аргументів командного рядка. Перевіряти, чи не виникають помилки при системних викликах.

5. Написати функцію, що визначає, чи є право читати користувачеві заданий файл? Аргументом є колійне ім'я файлу. Функция возвращает значение 0, если такое право есть, и -1 в противном случае.

6. Написать функцию, определяющую, установлен ли бит смены идентификатора пользователя (S_ISUID) ? Аргументом является путевое имя файла. Функция возвращает значение 0, если это так, и -1 в противном случае.

7. Написать функцию, определяющую, является ли заданный файл символической ссылкой? Аргументом является путевое имя файла. Функция возвращает значение 0, если является, и -1 в противном случае.

8. Написать функцию, возвращающую длину файла. Аргументом функции является файловый дескриптор.

9. Открыть файл, указанный в командной строке, и выдать на экран параметры доступа к открытому файлу. Написать функцию, принимающую на входе файловый дескриптор и снимающую флаг, дающий право на запись в соответствующий файл, если он установлен. Проверить действие этого флага до и после снятия, вывести отчет на экран.

10. Определить, будет ли создаваться файл, указанный в командной строке, при программном обращении к нему. Вывести результат проверки на экран.

11. Написать функцию, принимающую на входе файловый дескриптор и определяющую, как при записи будут помещаться данные в соответствующий файл: в конец либо в начало. Выдать результаты проверки на экран.

12. Написать функцию, принимающую на входе файловый дескриптор и снимающую флаг O_NONBLOCK для соответствующего файла. Проверить действие этого флага до и после снятия, вывести результаты проверки на экран.