Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
MetLab_SPO_2011.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
651.26 Кб
Скачать

Лабораторна робота № 4 Асинхронне видалення дочірніх процесів за допомогою сигналу sigchld. Потоки, що повертають значення

Проведення заняття розраховано на 4 години

Мета роботи: отримати практичні навички навички по організації видалення дочірніх процесів за допомогою сигналу SIGCHLD і написанню програм, що використовують потоки, що повертають значення

Завдання 1: Розробити програму, що демонструє видалення дочірніх процесів за допомогою обробки сигналу SIGCHLD.

Завдання 2: Написати програму, в якій реалізований потік повертає 5000-е просте число.

Рекомендації до виконання:

Сигнали - це механізм зв'язку між процесами. Всі вони розпізнаються по номерах, але в програмах для посилання на сигнали використовують символічні константи. У UNIX ці константи визначені у файлі /usr/include/bits/signum.h. У програмі для посилання на сигнали потрібно підключати файл <signal.h>.

Сигнал SIGCHLD посилається якраз тоді, коли завершується дочірній процес. Сигнал є спеціальним повідомленням, що посилається процесу. У відповідь на одержаний сигнал процес виконує ряд дій залежно від типу сигналу. Правила обробки сигналу визначає функція sigaction(), одержуюча три параметри: номер сигналу і два покажчики на структуру sigaction. Найбільш важливим полем структури sigaction є поле sa_handler, яке може приймати одне з трьох значень:

SIG_DFL – вибір стандартного обробника сигналу;

SIG_IGN – ігнорування сигналу;

покажчик на функцію обробки сигналу. Ця функція повинна приймати один параметр ( номер сигналу) і повертати значення типу void.

Якщо обробник використовує як яку-небудь змінну прапора надходження сигналу, то вона повинна мати спеціальний тип sig_atomic_t.

Потоки, як і процеси, - це механізм, що дозволяє програмам виконувати декілька дій одночасно. Потоки працюють паралельно. Ядро UNIX планує їх роботу асинхронно, перериваючи час від часу кожний з них, щоб дати шанс іншим. Всі функції і типи даних для роботи з потоками описані у файлі <pthread.h>. Кожному потоку в процесі призначається свій ідентифікатор, при посиланні на який в програмах потрібно використовувати тип даних pthread_t. Для створення потоку використовується функція pthread_create(). Для знищення потоку використовують функцію pthread_join().

Контрольні питання:

  1. Оскільки сигнал може прийти у будь-який момент, він може застати програму за виконанням критичної операції, що не має на увазі переривання. Тому обробник сигналу повинен виконувати мінімум дій у відповідь на отримання сигналу і щонайшвидше повертати управління в програму. Які дії звичайно програмуються в обробнику сигналу?

  2. У чому полягає особливість змінних типу sig_atomic_t?

  3. Назвіть параметри функцій pthread_create() і pthread_join().

Лабораторна робота № 5 Розробка багатофайлових програм Використання утиліти make

Проведення заняття розраховано на 4 години

Мета роботи: придбання практичних навиків створення багатофайлових програм, використання утиліти make для автоматизації цього процесу.

Завдання: Модифікувати програму, що використовує сигнал SIGCHLD ( із завдання до лабораторної роботи №7), зберігши всі використовувані функції у вигляді окремих *.c файлів. Створити Makefile і продемонструвати використання утиліти make для автоматизації процесу збірки програми.

Теоретичні відомості:

Компіляція програм, що містять дві і більш функцій

Як відомо, з метою підвищення рівня структурованості, програма на мові С є набором функцій. Кожна функція С в програмі має рівні права з іншими функціями. Кожна з них може викликати будь-яку іншу функцію або викликатися будь-якою іншою функцією.

Чи не є функція main() особливою? Так, вона дещо відрізняється від інших тим, що, коли програма, що складається з декількох функцій, збирається воєдино, виконання починається з першого оператора у функції main(); але ця єдина перевага, що надається їй. Навіть функція main() може викликатися рекурсивно або іншими функціями, хоча на практиці це робиться рідко.

Простий підхід до використання декількох функцій - приміщення їх в один файл. Потім досить скомпілювати цей файл, неначебто він містив єдину функцію. Але такий підхід прийнятний тільки для простих, учбових програм. На практиці при розробці реальних проектів призначають різним завданням різні функції, що сприяє поліпшенню програми.

Припустимо, що в системі Linux встановлений компілятор GNU C - gcc і file1.c, file2.c - два файли, що містять функції С. Тоді наступний командний рядок скомпілює обидва файли і створить виконуваний файл, ім'я за умовчанням якого а.out.

$gcc file1.c file2.c

Крім того, при цьому створюються два об'єктні файли, названі file1.o file2.o. Якщо згодом змінити файл file1.c, але залишити file2.c незмінним, можна скомпілювати перший файл і об'єднати його з об'єктною версією другого файлу, скориставшись командою:

$gcc file1.c file2.o

Використання файлів заголовків

Якщо помістити функцію main(), а визначення функцій - в другий, перший файл все ж таки потребуватиме прототипів функцій. Замість того, щоб вводити їх при кожному використанні файлу функції, прототипи функцій можна зберігати у файлі заголовка. Файли заголовків містять визначення функцій - число передаваних аргументів, типи аргументів і повертаного значення. Саме це і робить стандартна бібліотека C, наприклад, поміщаючи прототипи функцій введення/виведення у файл stdio.h. Більшість системних файлів заголовків розташована в каталогах /usr/include або /usr/include/sys.

Автоматизація процесу створення програми за допомогою GNU-утиліти make

Утиліта make дозволяє автоматично перекомпілювати програму. Основна ідея утиліти make проста. Їй указуються цільові модулі, що беруть участь в процесі побудови виконуваного файлу, і правила, по яких протікає цей процес. Також задаються залежності, що визначають, коли конкретний цільовий модуль повинен бути перебудований. Крім очевидних цільових модулів повинен також існувати модуль clean. Він призначений для видалення всіх об'єктних файлів, що згенерували, і програм, щоб можна було почати все з початку. Правило для даного модуля включає команду rm, що видаляє перераховані файли:

clean:

rm –f *.o <имя исполнимого файла>

Щоб передати всю інформацію про процес створення програми утиліті make, необхідно створити файл Makefile. У ньому цільові модулі перераховуються зліва. За ім'ям модуля слідує двокрапка і існуючі залежності. У наступному рядку указується правило, по якому створюється модуль. Рядок правила повинен починатися з символу табуляції, інакше утиліта make проінтерпретує її неправильно.

Приклад:

Написати програму, в якій обчислюється величина, зворотна значенню, переданому програмі через аргумент командного рядка при запуску.

Листинг файлу main.c

#include<stdio.h>

#include "reciprocal.h"

int main(int argc,char **argv)

{

int i;

i=atoi(argv[1]);

printf("i=%d",i);

printf("The reciprocal of %d is %lf",i,reciprocal(i));

return 0;

}

Листинг файлу reciprocal.c

#include<stdio.h>

#include<stdlib.h>

#include "reciprocal.h"

double reciprocal(int i)

{

if(i==0)

{

printf(" Devided by zero \n");

exit(1);

}

return 1.0/i;}

Листинг файлу reciprocal.h

double reciprocal(int i);

Makefile

reciprocal: main.o reciprocal.o

gcc -o reciprocal main.o reciprocal.o

main.o: main.c reciprocal.h

gcc -c main.c

reciprocal.o: reciprocal.c reciprocal.h

gcc -c reciprocal.c

clean:

rm -f *.o reciprocal

Контрольні питання:

  1. Що є багатофайлова програма на мові С?

  2. Як створюються багатофайлові програми?

  3. Як і з якою метою в багатофайлових програмах використовують файли заголовків для функцій, що викликаються?

  4. Для чого призначена GNU-утиліта make?

  5. Що є Makefile і які вимоги по його складанню?

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]