Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Метвказівки для Астистовой1.doc
Скачиваний:
1
Добавлен:
08.11.2019
Размер:
288.26 Кб
Скачать

Приклад виконання завдання

У розглянутому прикладі після породження процесу - нащадка батьківський процес виводить на термінал ідентифікатор породженого процесу, затримується на 5 секунд і викликає функцію для опитування стану процесу - нащадка. Породжений процес виводить повідомлення, що містить значення змінної x. Слід звернути увагу на те, що значення цієї змінної співпадають і у батька, і у нащадка.

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <errno.h>

int main()

{

int x, pid;

x=2;

printf("Single process, x=%d\n",x);

pid=fork();

if(pid == 0)

printf("New, x=%d\n",x); // Нащадок

else if(pid > 0){ // Батько

printf("Old, pid=%d, x=%d\n",pid,x);

sleep(5);

wait(pid);

}

else {

perror("Fork error ");

return -1;

}

return 0;

}

Завдання

Розробити програму, що виконує " розгалудження" за допомогою системного виклику fork(). Вивести на екран ідентифікатори PID і PPID батьківського і дочірнього процесів. Використати функцію перенаправлення стандартного виведення у файл.

Варіанти завдань

1. Призупинити на 1 секунду батьківський процес. У дочірньому процесі з допомогою системного виклику system() виконати стандартну команду ps, перенаправивши виведення у файл номер 1. Услід за цим завершити дочірній процес. У батьківському процесі викликати ps і перенаправити у файл номер Звільнити ячейку таблиці процесів породженого процесу.

2. Призупинити на 1 секунду батьківський процес. Виконати в дочірньому процесі один з системних викликів exec(), передавши йому в якості параметра стандартну програму ps. Аналогічно виконати виклик ps у батьківському процесі. Результати роботи команд ps в обох процесах перенаправити в один і той же файл.

3. Визначити в програмі глобальну змінну var зі значенням, рівним 1. Перевизначити стандартне виведення і батьківського, і дочірнього процесів в один і той же файл. До виконання розгалудження збільшити на 1 змінну var, причому вивести її значення, як до збільшення, так і після. У батьківському процесі збільшити значення змінної на 3, а в дочірньому на 5. Вивести значення змінної до збільшення і після нього усередині кожного з процесів. Результат пояснити.

4. Призупинити на 1 секунду дочірній процес. У дочірньому процесі за допомогою системного виклику system() виконати стандартну команду ps, перенаправивши виведення у файл номер 1. Услід за цим завершити дочірній процес. У батьківському процесі викликати ps і перенаправити у файл номер Звільнити елемент таблиці процесів породженого процесу.

5. Призупинити на 1 секунду дочірній процес. Виконати в дочірньому процесі один з системних викликів exec(), передавши йому в якості параметра стандартну програму ps. Аналогічно виконати виклик ps у батьківському процесі. Результати роботи команд ps в обох процесах перенаправити в один і той же файл. Звільнити елемент таблиці процесів породженого процесу.

6. Програма породжує через кожні 2 секунди 5 нових процесів. Кожен з цих процесів виконується заданий час і зупиняється, повідомляючи про це батька. Програма-батько виводить на екран усі повідомлення про зміни у процесах.

7. Програма запускає за допомогою функції exec() новий процес. Завершити процес-нащадок раніше формування батьком виклику. Повторити запуск програми за умови, що процес-нащадок завершується після формування виклику wait(). Проаналізувати результати.