- •Лабораторна робота №1
- •Основні положення. Поняття операційної системи.
- •Завдання
- •Лабораторна робота № 2.
- •Основні положення
- •1. Поняття файлу
- •2. Поняття файлової системи
- •3. Типи файлів
- •4. Імена файлів
- •5. Організація інформації у файловій системі
- •6. Загальні відомості про файлові операції
- •Приклад виконання завдання.
- •Завдання
- •Контрольні питання
- •Лабораторна робота № 3
- •Основні положення.
- •1. Каталоги
- •2. Операції над каталогами
- •3. Робота з каталогами в posix
- •Приклад виконання завдання
- •Завдання
- •Контрольні питання
- •Лабораторна робота № 4
- •Основні положення.
- •Створення процесу.
- •Ієрархія процесів.
- •Реалізація процесів.
- •4. Системні виклики для роботи з процесами
- •Приклад виконання завдання
- •Завдання
- •Контрольні питання
- •Лабораторна робота № 5
- •Основні положення
- •1. Застосування каналів.
- •Приклади виконання завдань
- •Завдання
- •Контрольні питання
- •Лабораторна робота № 6
- •Основні положення.
- •1. Черга повідомлень.
- •2. Створення черг повідомлень.
- •Прикдад виконання завдання
- •Завдання
- •Контрольні питання
Приклади виконання завдань
Наведений приклад ілюструє передачу короткого повідомлення між батьківським і дочірнім процесами.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
int main()
{
pid_t childPid;
int flds[2], status;
char buf[]="Message";
// Створення каналу
if (pipe(flds) == -1) {
perror("Pipe");
exit(1);
}
// Розгалудження процесів
switch (childPid=fork()) {
case -1: perror("fork");
exit(2);
case 0: close(flds[0]); //Потомок
printf("Child process %d\n", getpid());
write(flds[1], buf, strlen(buf));
close(flds[1]);
exit(0);
}
// Процес - батько
printf("Process %d\n", getpid());
close(flds[1]);
read(flds[0], buf, 80);
printf("String -> %s\n", buf);
close(flds[0]);
wait(&status);
return status;
}
На початку програми створюється канал і формуються два ідентифікатори файлів для цього каналу(flds[0] і flds[1]). Вважатимемо, що у батьківського процесу flds[0] використовується для прийому даних, тому на початку секції батьківського процесу необхідно закрити канал, пов'язаний з файловим ідентифікатором flds[1]. У породженому процесі закривається канал з ідентифікатором flds[0].
Наступний приклад ілюструє обмін даними між двома незалежними процесами через іменований канал.
Перша програма служить сервером, вона створює іменований канал по функції mkfifo(NAME, S _ IFIFO|S _ IRWXU|S _ IRWXG|S _ IRWXO). Як перший параметр використовується рядок, визначений константою NAME.
Другий параметр є комбінацією ключів, що визначають дозвіл повних прав доступу для усіх категорій користувачів. Після створення каналу на стороні сервера він відкривається в режимі читання. Після приходу повідомлення, текст цього повідомлення виводиться на екран і канал закривається. У кінці програми функцією unlink(NAME) канал знищується. Відкриття і знищення каналу виконуються з використанням одного і того ж імені (константа NAME зі значенням "sfifo.cc").
/* Сервер. Створює FIFO і чекає повідомлення */
#include <iostream.h>
#include <stdio.h>
#include <errno.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#define NAME "sfifo.cc"
int main()
{
int fd;
char buf[80];
unlink(NAME);
if(mkfifo(NAME, S_IFIFO|S_IRWXU|S_IRWXG|S_IRWXO)) {
perror("Помилка FIFO");
return 1;
}
if((fd=open(NAME, O_RDONLY))==-1) {
perror("Помилка відкриття файла сервера");
}
read(fd, buf, sizeof(buf));
cout<<"Отримано->"<<buf<<endl;
close(fd);
unlink(NAME);
return 0;
}
Програма - клієнт виводить на екран текст запиту на введення повідомлення і після введення рядка відкриває канал на запис. Після передачі вмісту буфера в канал, останній закривається.
/* Клієнт */
#include <iostream.h>
#include <stdio.h>
#include <errno.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <sys/stat.h>
#define NAME "sfifo.cc"
int main()
{
char text[80];
int fd;
cout<<"Ввести повідомлення"<<endl;
cin>>text;
if((fd=open(NAME, O_WRONLY))==-1) {
perror("Помилка відкриття клієнта");
return 1;
}
write(fd, text, strlen(text));
close(fd);
return 0;
}