
- •Лабораторна робота №1
- •Основні положення. Поняття операційної системи.
- •Завдання
- •Лабораторна робота № 2.
- •Основні положення
- •1. Поняття файлу
- •2. Поняття файлової системи
- •3. Типи файлів
- •4. Імена файлів
- •5. Організація інформації у файловій системі
- •6. Загальні відомості про файлові операції
- •Приклад виконання завдання.
- •Завдання
- •Контрольні питання
- •Лабораторна робота № 3
- •Основні положення.
- •1. Каталоги
- •2. Операції над каталогами
- •3. Робота з каталогами в posix
- •Приклад виконання завдання
- •Завдання
- •Контрольні питання
- •Лабораторна робота № 4
- •Основні положення.
- •Створення процесу.
- •Ієрархія процесів.
- •Реалізація процесів.
- •4. Системні виклики для роботи з процесами
- •Приклад виконання завдання
- •Завдання
- •Контрольні питання
- •Лабораторна робота № 5
- •Основні положення
- •1. Застосування каналів.
- •Приклади виконання завдань
- •Завдання
- •Контрольні питання
- •Лабораторна робота № 6
- •Основні положення.
- •1. Черга повідомлень.
- •2. Створення черг повідомлень.
- •Прикдад виконання завдання
- •Завдання
- •Контрольні питання
Приклад виконання завдання.
Розглянемо простий приклад копіювання даних з одного файлу в новий файл.
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <unistd.h>
int main()
{
int fdIn; //Вхідний файл
int fdOut; //Вихідний файл
char buf[256]; //Буфер обміну
char InName[20], OutName[20]; //Імена файлів
ssize _ t nRd;
// Введення імен вхідного і вихідного файлів
printf("Ім'я вхідного файлу -> ");
gets(InName);
printf("Ім'я вихідного файлу -> ");
gets(OutName);
// Відкриття файлів
if((fdIn=open(InName, O _ RDONLY))==- 1)\u007B
perror("Помилка відкриття вхідного файлу");
_ exit(- 1);
}
if((fdOut=open(OutName, O _ WRONLY|O _ CREAT, 644))==- 1)\u007B
perror("Помилка відкриття вихідного файлу");
close(fdIn);
_ exit(- 2);
}
// Цикл копіювання
while((nRd=read(fdIn, buf, 256))>0)\u007B
if(write(fdOut, buf, nRd)<nRd)\u007B
perror("Помилка запису");
close(fdIn);
close(fdOut);
_ exit(- 3);
}
}
close(fdIn);
close(fdOut);
printf("Завершення програми\n");
_ exit(0);
}
При відкритті вхідного файлу задається ключ режиму роботи з файлом "тільки для читання"(O _ RDONLY). Функція повертає дескриптор відкритого файлу. У разі помилки повертається - 1. Для висновку повідомлення про помилку використовується функція perror(). Ця функція виводить текст, що задається їй в якості аргументу. Крім того, функція обробляє системний номер помилки (errno) і додає в рядок, що виводиться, системне повідомлення про помилку.
Функція, що відкриває вихідний файл, повертає дескриптор вихідного файлу. Ця функція виконується з режимами "тільки для запису" (O _ WRONLY) і з ключем створення нового файлу (O _ CREAT). Окрім цього, при виклику функції використовується третій параметр (644), що визначає права доступу до створюваного файлу (читання і запис для власника і тільки читання для інших користувачів).
Створення і знищення жорстких посилань на файли організовуються при використанні функцій link() і unlink(). Зміни режимів доступу до файлів виконуються функціями chmod() і fchmod().
У наведеному прикладі створюється жорстке посилання файлу stat_ex.c на файл з новим ім'ям link_ex.c. При створення посилання функцією link("stat_ex.c", "link_ex.c") в структурі statf фіксується стан початкового файлу, потім число жорстких посилань із структури виводиться на екран. Після цього жорстке посилання знищується (функцією unlink("link _ ex.c")) і знову виводиться лічильник жорстких посилань.
/* Приклад використання функцій link() і stat() */
#include <unistd.h>
#include <sys/stat.h>
main()
{
struct stat statf;
if(link("stat_ex.c","link_ex.c") == -1) {
perror(Помилка link");
return 1;
}
if(stat("stat_ex.c",&statf)) {
perror("Помилка stat");
return 1;
}
printf("Кількість посилань = %d\n",statf.st_nlink);
if(unlink("link_ex.c")) {
perror("Помилка unlink");
return 1;
}
if(stat("stat_ex.c",&statf)) {
perror("Помилка stat");
return 1;
}
printf("Кількість посилань = %d\n",statf.st_nlink);
puts("Кінець програми");
}
Наступний приклад ілюструє можливість зміни режиму доступу до файлу. На початку програми при виклику функції access ("acc _ ex.c", F _ OK |!X _ OK) для файлу acc _ ex.cc виконується перевірка, чи існує файл (прапор F _ OK) і чи заборонений доступ на виконання (прапор !X _ OK) для процесу, що викликає функцію. Якщо файл існує, а доступ на виконання заборонений, то функція повертає значення нуль (виконання заданих прапорами умов). В цьому випадку для установки нових значень прав доступу викликається функція chmod("acc _ ex.c", S _ IRUSR|S _ IWUSR|S _ IXUSR|S _ IROTH|S _ IRGRP). Перший параметр визначає ім'я файлу, значення другого параметра формується логічним складанням прапорів, які визначають дозвіл на читання, запис і виконання для користувача і членів групи, до якої належить користувач. Якщо функція повертає ознаку помилки (результат, відмінний від нуля), то на термінал виводиться повідомлення про помилку і програма повертає код 1.
/* Приклад перевірки файлу і зміни режиму */
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
main()
{
if( ! access("acc_ex.c", F_OK | !X_OK)) {
puts("Установка прав");
if(chmod("acc_ex.c",S_IRUSR | S_IWUSR | S_IXUSR |
S_IROTH | S_IRGRP)) {
perror("Помилка зміни режиму");
return 1;
}
}
}