- •Анотація
- •1 Середовище програмування ос unix
- •1.1 Структура ос unix
- •1.2 Створення програми
- •1. Препроцесор
- •2. Транслятор
- •2.1 Компілятор
- •2.2 Асемблер
- •3. Редактор зв'язків(Компонувальником)
- •1.3 Формати об'єктних файлів
- •2 Використання файлової системи unix
- •2.1 Основні поняття
- •2.1.1 Типи та іменування файлів
- •2.1.2 Права доступу до файлів
- •2.1.3 Cистемные структури керування файлами
- •2.1.4 Системні виклики роботи з файлами
- •2.2 Створення та відкриття файлів
- •2.2.1 Системний виклик open
- •2.2.2 Системний виклик create
- •2.2.3 Системний виклик close
- •2.3 Читання та зипис в файл
- •2.3.1 Системний виклик read
- •2.3.2 Системний виклик write
- •2.4 Позіціонування у файлі
- •2.4.1 Системний виклик lseek
- •2.4.2 Системні виклики pread і pwrite
- •2.4.3 Системні виклики readv і writev
- •2.5 Контрольні операції над файлами
- •2.5.1 Системні виклики stat, fstat і lstat
- •2.5.2 Контроль прав доступу до файлу
- •2.5.3 Функція fcntl
- •2.5.4 Системні виклики truncate і ftruncate
- •2.6 Управління каталогами
- •2.6.1 Створення і видалення
- •2.6.2 Читання каталога
- •2.6.3 Зміна каталога
- •2.7 Управління посиланнями
- •2.7.1 Управління жорсткими посиланнями
- •2.7.2 Управління символічними посиланнями
- •2.7.3 Перейменування файлів і каталогів
- •3 Керування процесами ос unix
- •3.1 Процеси ос unix
- •3.2 Сисвизови створення процесів
- •3.3 Завершення процесу
- •3.4 Взаємодія процесів в ос unix
- •3.5 Сигнали
- •3.5.1 Поняття сигналу
- •3.5.2 Розробка оброблювачів сигналів
- •3.5.3 Генерація сигналів
- •3.5.4 Посилка сигналів іншим процесам
- •3.5.5 Блокування сигналів
- •3.5.6 Очікування сигналу
- •3.6 Трасування процесу.
- •3.7 Канали й fifo-Файли
- •3.7.1 Поняття
- •3.7.2 Створення каналу
- •3.7.3 Створення fifo-Файлів
- •3.8 Семафори
- •3.9 Повідомлення.
- •3.10 Поділювана пам'ять.
- •Література
- •Системне програмування Навчальний посібник
- •65082, Одеса, вул. Дворянська, 1/3
3.3 Завершення процесу
Завершення процесу є більше простим завданням, чим його запуск. Головним при цьому є від'єднання свопингового зображення процесу, що ускладнюється, коли текст або його частина є поділюваними й тому не можуть бути фізично отсоединены.
Можливий випадок, коли з ряду причин вхід у таблицю процесів для даного процесу може залишитися в пам'яті після від'єднання свопингового зображення. Це відбувається в тому випадку, коли процес-батько має потребу в інформації про процес-ребенке після його завершення.
Є дві можливості знищити процес. Перша полягає в тому, щоб послати до процесу сигнал про неявний (якому мається на увазі) дії, що й буде сигналом про смерть процесу. Друга полягає в тому, щоб використовувати системний виклик exit().
Якщо було викликане знищення процесу, то він сам переводить себе в те, що називається ZOMBIE PROCESS (знищуваний або пам'яті, що позбавляється, процес). Цей стан описує процес як "мертвий", тобто він позбавлений свопингового зображення, але ще існує в таблиці процесів. Такий стан необхідно тільки для того, щоб процес-батько або пов'язані з ним взаємодіючі процеси виводити зі стану wait(). Зомбі-Процес запустити знову не вдасться, тому що для нього вже не існує свопингового зображення.
Коли процес-дитина умирає, процес-батько сповіщається про це сигналом SIGCLD, після одержання якого він може зняти вхід процесу-дитини в таблиці процесів. Якщо процес-батько вмирає першим, процес-дитина йому успадковує через процес 1. Процес 1 є спадкоємцем процесу 0 і батьком всіх процесів, крім нульового. Якщо з якої-небудь причини процес-батько не знищив вхід померлого процесу-дитини, то це зробить процес 1.
Т.о. повторимо завдання, які виконує системний виклик exit():
придушує дії свех сигналів, які були заявлені для процесу, що завершується:
закриває файли, раніше відкриті процесом, що завершується;
від'єднує свопинговое зображення процесу, що від'єднується;
установлює статус процесу, що завершується, як p_stat = SZOMB;
повідомляє процес-батько про смерть процесу-дитині посилкою до нього сигналу SIGCLD;
указує процесу-ребенку, що він не є підлеглим процесу-батькові, установивши для процесу-батька ppid = 1;
якщо з'явився зомбі-дитина, то про це повідомляється процес 1;
передає ключ до нового процесу.
3.4 Взаємодія процесів в ос unix
Дуже важливим фактором ОС UNIX є те, що процеси, що йдуть під його керуванням, повністю незалежні при виконанні й мають строго свої зони даних. Це спрощує керування виконанням кожного окремого процесу, але створює складності при передачі інформації між процесами, необхідність у якій періодично з'являється в процесі роботи. Такого роду передачі забезпечуються системними функціями UNIX, призначеними для комунікацій між процесами, що забезпечують:
обмін інформацією,
синхронізацію, що контролює розвиток пройесса в часі і його взаємозв'язок з іншими процесами, які можуть проходити одночасно з ним.
Є шість різних механізмів, що забезпечують межпроцессные комунікації:
messages - пакети даних, посыдаемых від одного процесу іншому;
shared memory - зони даних, використовувані більш ніж одним процесом;
pipes - спеціальний тип файлів даних, що використовує механізм доступу FIFO;
process tracing - трасування - обмін інформацією з контролем, виконуваний між процесом-батьком і процессом-ребенком (насамперед використовується отладчиком);
synchronization signals - системні прапори, що відзначають появу певних подій;
Death of Child - спеціальний сигнал, що повідомляє процесу-батькові, що процес-дитина закінчився.
Їм відповідають системні виклики, що дозволяють инициализировать відповідні дії із програми:
Таблиця 4
Системні викликі межпроцесних комунікацій
|
signal |
signal() kill() pause() |
визначає, що треба робити, якщо сигнал отриманий. посилає сигнал до процесу або групи процесів. припиняє прцессы до одержання сигналу. |
|
pipes |
pipe() mknode() |
створює канал зв'язку між процесами. створює файл із доступом FIFO. |
|
Wait for Child |
wait() exit() |
ожидаетостановки або завершення процесу- дитини. заершает процес. |
|
process tracing |
ptrace() msgget() msgsnd() msgrcv() msgctl() |
трасування процесу. одержання повідомлення із черги. посилка повідомлення в чергу. читання повідомлення із черги. виконання операції по контролі за сооб- щением. |
|
semaphores |
semget() semop() semctl() |
одержати установку семафорів. виконати операції над семафорами. виконати операції по контролі за сема- фором. |
|
shared memory |
shmget() shmat() shmdt() shmctl() |
одержати сегмент поділюваної пам'яті. приєднати зазначений сегмент поділюваної пам'яті. отсоединить зазначений сегмент поділюваної пам'яті. виконати операції по контролі разделяе- мий пам'яті. |