- •Міністерство освіти і науки України
- •Жуковецька с.Л., Шестопалов с.В.
- •Анотація
- •Введення
- •Лабораторна робота №1 Технологія розробки програм у середовищі Linux
- •1. Команди роботи з командним інтерпретатором ос unix
- •2. Створення програми
- •3. Функції введення-виведення.
- •4. Приклад програми
- •5. Основні керуючі конструкції мови с
- •6. Індівідуальні завдання
- •Лабораторна робота № 2. Автоматизація пакетних завдань
- •1. Компіляція багатомодульною програми
- •2. Автоматизація пакетних завдань
- •4. Завдання
- •Лабораторна робота № 3. Взаємодія програми з середовищем виконання
- •1. Аргументи командного рядка
- •2. Змінні оточення
- •3. Індівідуальні завдання
- •Лабораторна робота №4. Контроль виконання програми
- •1. Коди завершення програми
- •2. Функції обробки значення errno
- •3. Функція atexit()
- •4. Макрос asssert()
- •5. Індівідуальні завдання
- •Лабораторна робота №5 Файлові api.
- •1 Основні поняття
- •2. Права доступу до файлів
- •3. Інтерфейси для файлового введення / виводу
- •4. Системні виклики роботи з файлами
- •5. Індівідуальні завдання
- •Варіанти завдань
- •Лабораторна робота №6 Робота з каталогами та посиланнями
- •Методичні вказівки
- •1. Створення та видалення каталогу
- •2. Читання каталогу
- •3. Зміна каталогу
- •4. Управління жорсткими посиланнями
- •5. Управління символічними посиланнями
- •6. Перейменування файлів і каталогів
- •7. Індівідуальні завдання
- •Лабораторна робота №7. Одержання і відображення метаданих файлу.
- •Методичні вказівки
- •1. Механізми управління файлами ос unix
- •2. Отримання даних індексного дескриптору
- •3. Додаткові функції маніпулювання даними індексних дескрипторів
- •4. Отримання даних про відкриті файли
- •5. Індівідуальні завдання
- •Лабораторна робота №8. Керування процесами
- •Методичні вказівки
- •1. Загальні поняття
- •2. Створення поцесу
- •4. Перезавантаження програми процесу
- •5. Завершення виконання процесу
- •6. Системні виклики wait, waitpid
- •7. Індівідуальні завдання
- •Лабораторна робота №9. Використання каналів
- •Методичні вказівки
- •1. Заганьні відомості
- •2. Використання каналів
- •3. Індівідуальні завдання
- •Варіанти завдань
- •Лабораторна робота №10 Використання повідомлень
- •Методичні вказівки
- •1. Загальні відомості
- •2. Використання повідомлень
- •3. Індівідуальні завдання
- •Література
- •Системне програмування Посібник до виконання лабораторних та самостійних робіт
- •65082, Одеса, вул. Дворянська, 1/3
2. Отримання даних індексного дескриптору
Процедура читання даних з індексного вузла прямо з файлу пристрою є занадто низкоуровневой. На щастя, для одержання інформації з індексних вузлів, існують три стандартних системних виклики - stat, lstat і fstat і одна дуже відома команда - ls.
stat — повертає відомості про файл по його ім'ю
«include <sys/stat.h>
int stat(const char *path, struct stat *buf )
path - повне ім'я файлу
struct stat *buf - структура, що зберігає значення індексного дескриптора файлу
Повертає 0 у випадку успіху, -1 у випадку помилки (код помилки -у змінної errno)
lstat — повертає відомості про файл по його ім'ю без разыменования символічних посилань
«include <sys/stat.h>
int lstat(const char*path, struct stat *buf);
path - повне ім'я файлу
struct stat *buf - повертається информация
Повертає 0 у випадку успіху, -1 у випадку помилки (код помилки - у змінної errno) */
fstat — повертає відомості про файл по дескрипторі
#include <sys/stat.h>
int fstat(const int fd, struct stat *buf);
fd - дескриптор файлу
struct stat *buf - повертається информация
Повертає 0 у випадку успіху, -1 у випадку помилки (код помилки - у змінної errno)
Системний виклик stat приймає повне ім'я файлу й знаходить відповідний йому індексний вузол. Виклик fstat приймає дескриптор відкритого файлу й відшукує відповідний індексний вузол у таблиці активних вузлів ядра. Виклик lstat аналогічний виклику stat за одним виключенням - якщо як ім'я файлу було передане символічне посилання, то буде повернута інформація про саме посилання, а не про об'єкт, що вона представляє*. Всі три виклики повертають ті самі метаданные, через структуру типу stat, у першому аргументі.
Нижче приводиться визначення структури stat. Однак у деяких реалізаціях поля структури можуть бути переставлені місцями, можуть бути додані нові поля,
struct stat — структура для прийому відомостей з stat, fstat і lstat
struct stat {
dev_t st_dev; ідентифікатор пристрою
ino_t st_ino; номер індексного вузла
mode_t st_mode; режими доступу, тип
nlink_t st_nlink; кіл-у твердих посилань
uid_t st_uid; ідентифікатор користувача
gid_t st_gid; ідентифікатор групи
dev_t st_rdev; ідентифікатор пристрою (для спеціального
файлу)
off_t st_size; розмір у байтах
time_t st_atime; час останнього обігу
time_t st_mtime; час останньої зміни
time_t st_ctime; час останньої зміни
blksize_t st_blksize; оптимальний розмір блоку (для операцій
уведення-висновку)
blkcnt_t st_blocks; кіл-у блоків по 512 байт
}
Ідентифікатор пристрою (типу dev_t) - це число, унікальне для кожної змонтованої файлової системи, навіть для NFS-Томів. Таким чином, комбінації st_dev і st_ino однозначно ідентифікують будь-який індексний вузол у системі.- властиво пристрій. Як правило, молодший номер пристрою - це самий молодший байт.
Поле st.dev - це пристрій, на якому перебуває індексний вузол. Поле st_rdev використовується тільки для спеціальних файлів пристроїв і є пристроєм, що спеціальний файл представляє.
Поле st_size інтерпретується залежно від типу файлу й реалізації. Для звичайних файлів, каталогів і символічних посилань - це обсяг даних на диску (для символічних посилань - довжина шляхи). Для об'єктів у поділюваній пам'яті - обсяг займаної пам'яті. Для каналів - кількість даних у каналі.
Поле st_blksize призначене для зміни розміру блоку файлу. У більшості випадків, імовірно, має те ж призначення, що й аналогічне поле в суперблоці.
Якщо файл має «діри», отримані як результат установки поточної позиції у файлі за його межі й наступного запису яких-небудь даних, значення st_blocks * 512 може виявитися менше значення st_size.
Системний виклик fstat особливо затребуваний у ситуаціях, коли потрібно одержати відомості про елемент, що не має шляху у файловій системі, наприклад, про неіменований канал або сокете. Для цих об'єктів поля st_mode, st_ino, st_dev, st_uid, st_gid, st_atime, st_ctime і st_mtime містять актуальні значення, але що стосується інших полів - все залежить від реалізації. Проте, для іменованих і неіменованих каналів поле st_size, як правило, містить кількість непрочитаних байт у каналі.
Поле st_ctime Час останньої зміни індексного вузла (st_ctime) іноді називається як «час останньої зміни статусу».змінюється (установлюється рівним поточного астрономічного часу) при застосуванні до файлу викликів creat, chmod, chown, link, unlink, mknod, utime*, write (тому що змінюється довжина файлу); не обновляється при читанні даних з файлу. Це поле варто розглядати як час модифікації прав доступу до файлу;
st_mtime - write, creat, mknod, utime; Це поле варто розглядати як час модифікації вмісту файлу (даних);
st_atime - read, creat, mknod, utime; Це поле варто розглядати як час читання вмісту файлу (даних).
Визначення типу файлу
Поле st_mode містить 12 біт, що визначають тип файлу й права доступу. Макрос S_IFMT - це маска всіх битов, які ставляться до типу файлу в поле st_mode.
Операція st_mode файлу & S_IFMT повертає значення типу:
S_IFREG - звичайний файл
S_IFDIR - каталог
S_IFBLK - спеціальний файл блокового пристрою
S_IFCHR - спеціальний файл символьного пристрою
S_IFIFO - іменований або неіменований канал
S_IFLNK - символічне посилання
S_IFSOCK - сокет
struct stat sbuf;
…....
if(stat(file, &sbuf) == 0)
if((sbuf.st_mode & S_IFMT) == S_IFDIR)
printf(“A directory\n”);
UNIX містить ряд макросів для визначення типу файлу. Вони визначаються в <sys/stat.h> and <linux/stat.h>:
S_ISREG() regular file
S_ISDIR() directory file
S_ISCHR() char. special file
S_ISBLK() block special file
S_ISFIFO() pipe or FIFO
S_ISLNK() symbolic link
S_ISSOCK() socket
Перевірка - чи є файл сокетом, за допомогою макросу може бути виконана так:
if (S_ISSOCK(buf.st_mode))
Визначення прав доступу до файлу
Для визначення прав доступу в поле st_mode є 9 біт. Імена цих макросів додержуються форми запису: s_Ipwww, де символ p - режим доступу (R, w або X), a www - кому видане право на цей режим доступу (USR, GRP або OTH).
S_Ixwww де x = R|W|X, www = USR|GRP|OTH
приклади:
S_IRUSR,
S_IWOTH
S_ISUID set-user-id bit is set
S_ISGID set-group-id bit is set
S_ISVTX sticky bit is set
Ці макроси являють собою бітові маски.
Приклад використання.
Розглянемо програму, що друкує інформацію про всіх відкриті нею файлах і каналах. Для цієї мети використовуйте системний виклик
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/param.h>
#include <sys/param.h>
#include <sys/fcntl.h>
main
{
struct stat st;
int fd;
open(“file”,O_RDONLY);
for(fd=0; fd < NOFILE; fd++ )
if (fstat(fd, &st ==0)
{ printf("File stats\n");
printf(" File size: %ld\n", st.st_size);
printf(" Permission: %o\n", st.st_mode & 0x01ff);
/*шестнадцатеричное число = 0001 1111 1111
Можна так
stat( имяфайла, &st);
кодыдоступа = st.st_mode & 0777;
або S_IRWXU| S_IRWXG| S_IRWXO
*/
printf(" Owner uid: %d\n", st.st_uid);
printf(" Owner gid: %d\n", st.st_gid);
printf("\n");
}
}
}
Програма може використовувати дескриптори файлів з номерами 0..NOFILE-1 (звичайно 0..19). Якщо fstat для якогось fd повернув код помилки (<0), це означає, що даний дескриптор не пов'язаний з відкритим файлом (тобто не використовується). NOFILE визначено в include-файлі <sys/param.h>, що містить різноманітні параметри даної системи.
По відкритому файлі не існує простого способу довідатися його ім'я. Для цього треба сисвызовом fstat довідатися номер пристрою й номер індексного дескриптора, після чого знайти у файловій системі відповідний запис.