Приклад. 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 для соответствующего файла. Проверить действие этого флага до и после снятия, вывести результаты проверки на экран.