В програмуванні, конкретно в контексті операційних систем Unix і UNIX-подібних систем, fork це системний виклик, який створює новий процес, який є копією батьківського процесу. Це зазвичай системний виклик, який реалізований на рівні ядра. Fork це основний (і історично, єдиний) метод створення процесу в UNIX-подібних операційних системах.
Огляд
Багатозадачна операційна система зазвичай повинна мати який-небудь механізм створення нового процесу — на основі вже запущеного, або повністю нового. У багатьох Unix-подібних операційних системах єдиним способом створення нового процесу і є системний виклик fork()
(новіші системи можуть мати також ). Для того, щоб процес розпочав виконання іншої програми, він спершу створює копію самого себе. Потім ця копія, яка називається "дочірній процес", виконує системний виклик для запуску в рамках себе іншої програми: він припиняє виконання своєї попередньої програми і починає виконувати іншу.
Unix системи мають функцію підтримки віртуальної пам'яті (практично всі сучасні варіанти її). Операція fork створює окремий адресний простір для дочірнього процесу. Цей дочірній процес матиме точну копію всіх сегментів пам'яті батьківського процесу, хоча, якщо реалізується семантика , фізична пам'ять фактично не буде скопійована. Замість того, сторінки віртуальної пам'яті обох процесів можуть звертатися до одних і тих самих сторінок фізичної пам'яті доки один із них не почне писати до такої сторінки: тоді вона копіюється.
Така оптимізація має велике значення для загального випадку, коли fork використовується в поєднанні з викликом exec, для того, щоб почати виконання нової програми: зазвичай, дочірній процес виконує лише невеликий набір команд перед тим як він припиняє виконання своєї програми, на користь програми, яка буде запущена, і вона потребує дуже мало, якщо потребує, структур даних від свого батьківського процесу.
Коли процес викликає fork()
його вважають батьківським процесом, і fork()
повертає PID новоствореного дочірнього процесу. Всередині новоствореного процесу fork()
повертає 0. У випадку невдачі повертається -1, а в змінну errno
поміщається код помилки. Після команди fork, обидва процеси не лише виконують одну і ту саму програму, але вони продовжують виконання так ніби обидві виконали системний виклик. Вони можуть перевіряти значення, які повертає виклик для визначення їхнього статусу, чи то дочірній процес, чи батьківський і діяти відповідно.
Системний виклик fork існував з першої версії операційної системи Unix, що запозичений із ранньої системи . Fork входить до стандарту POSIX.
Комунікація
Дочірній процес стартує із копією батьківських файлових дескрипторів. Для спілкування між процесами, батьківський процес часто буде створювати конвеєр або декілька конвеєрів, а після породження процесів закриє кінці конвеєрів, які більше не потрібні.
Використання у програмах
Приклад на C
Наступний варіант програми Hello World породжує за допомогою "fork" дочірній процес, який виводить на екран повідомлення і завершує виконання. Батьківський процес не виконує ніякої корисної роботи; він просто чекає на завершення дочірнього процесу.
#include <sys/types.h> /* pid_t */ #include <sys/wait.h> /* waitpid */ #include <stdio.h> /* printf, perror */ #include <stdlib.h> /* exit */ #include <unistd.h> /* _exit, fork */ int main(void) { int st; pid_t pid = fork(); switch (pid) { case -1: // fork() повертає -1, коли сталася помилка. perror("fork failed"); exit(EXIT_FAILURE); break; case 0: // Коли fork() повертає 0, це означає, що був створений дочірній процес. printf("Hello from the child process!\n"); _exit(EXIT_SUCCESS); // exit() недоступна тут, тому треба використовувати _exit break; default: // Коли fork() повертає додатне число, ми у батьківському процесі (void) waitpid(pid, &st, 0); // а значення, яке повертається це PID (ідентифікатор процесу) новоствореного дочірнього процесу. break; } return EXIT_SUCCESS; }
Примітки
- . Архів оригіналу за 14 березня 2016. Процитовано 13 березня 2016.
- Кен Томпсон; Денніс Рітчі (3 листопада 1971). (PDF). UNIX Programmer's Manual (англ.). Bell Labs. Архів оригіналу (PDF) за 3 лютий 2015. Процитовано 4 березень 2015.
- Ritchie, Dennis M.; Thompson, Ken (July 1978). (PDF). Bell System Technical Journal. AT&T. 57 (6): 1905—1929. doi:10.1002/j.1538-7305.1978.tb02136.x. Архів оригіналу (PDF) за 10 грудень 2005. Процитовано 22 квітня 2014.
- man про системні виклики (GNU/Linux) (англ.) – сторінка довідки
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
V programuvanni konkretno v konteksti operacijnih sistem Unix i UNIX podibnih sistem fork ce sistemnij viklik yakij stvoryuye novij proces yakij ye kopiyeyu batkivskogo procesu Ce zazvichaj sistemnij viklik yakij realizovanij na rivni yadra Fork ce osnovnij i istorichno yedinij metod stvorennya procesu v UNIX podibnih operacijnih sistemah OglyadBagatozadachna operacijna sistema zazvichaj povinna mati yakij nebud mehanizm stvorennya novogo procesu na osnovi vzhe zapushenogo abo povnistyu novogo U bagatoh Unix podibnih operacijnih sistemah yedinim sposobom stvorennya novogo procesu i ye sistemnij viklik fork novishi sistemi mozhut mati takozh Dlya togo shob proces rozpochav vikonannya inshoyi programi vin spershu stvoryuye kopiyu samogo sebe Potim cya kopiya yaka nazivayetsya dochirnij proces vikonuye sistemnij viklik dlya zapusku v ramkah sebe inshoyi programi vin pripinyaye vikonannya svoyeyi poperednoyi programi i pochinaye vikonuvati inshu Unix sistemi mayut funkciyu pidtrimki virtualnoyi pam yati praktichno vsi suchasni varianti yiyi Operaciya fork stvoryuye okremij adresnij prostir dlya dochirnogo procesu Cej dochirnij proces matime tochnu kopiyu vsih segmentiv pam yati batkivskogo procesu hocha yaksho realizuyetsya semantika fizichna pam yat faktichno ne bude skopijovana Zamist togo storinki virtualnoyi pam yati oboh procesiv mozhut zvertatisya do odnih i tih samih storinok fizichnoyi pam yati doki odin iz nih ne pochne pisati do takoyi storinki todi vona kopiyuyetsya Taka optimizaciya maye velike znachennya dlya zagalnogo vipadku koli fork vikoristovuyetsya v poyednanni z viklikom exec dlya togo shob pochati vikonannya novoyi programi zazvichaj dochirnij proces vikonuye lishe nevelikij nabir komand pered tim yak vin pripinyaye vikonannya svoyeyi programi na korist programi yaka bude zapushena i vona potrebuye duzhe malo yaksho potrebuye struktur danih vid svogo batkivskogo procesu Koli proces viklikaye fork jogo vvazhayut batkivskim procesom i fork povertaye PID novostvorenogo dochirnogo procesu Vseredini novostvorenogo procesu fork povertaye 0 U vipadku nevdachi povertayetsya 1 a v zminnu a href wiki Errno class mw redirect title Errno errno a pomishayetsya kod pomilki Pislya komandi fork obidva procesi ne lishe vikonuyut odnu i tu samu programu ale voni prodovzhuyut vikonannya tak nibi obidvi vikonali sistemnij viklik Voni mozhut pereviryati znachennya yaki povertaye viklik dlya viznachennya yihnogo statusu chi to dochirnij proces chi batkivskij i diyati vidpovidno Sistemnij viklik fork isnuvav z pershoyi versiyi operacijnoyi sistemi Unix sho zapozichenij iz rannoyi sistemi Fork vhodit do standartu POSIX KomunikaciyaDochirnij proces startuye iz kopiyeyu batkivskih fajlovih deskriptoriv Dlya spilkuvannya mizh procesami batkivskij proces chasto bude stvoryuvati konveyer abo dekilka konveyeriv a pislya porodzhennya procesiv zakriye kinci konveyeriv yaki bilshe ne potribni Vikoristannya u programahPriklad na C Nastupnij variant programi Hello World porodzhuye za dopomogoyu fork dochirnij proces yakij vivodit na ekran povidomlennya i zavershuye vikonannya Batkivskij proces ne vikonuye niyakoyi korisnoyi roboti vin prosto chekaye na zavershennya dochirnogo procesu include lt sys types h gt pid t include lt sys wait h gt waitpid include lt stdio h gt printf perror include lt stdlib h gt exit include lt unistd h gt exit fork int main void int st pid t pid fork switch pid case 1 fork povertaye 1 koli stalasya pomilka perror fork failed exit EXIT FAILURE break case 0 Koli fork povertaye 0 ce oznachaye sho buv stvorenij dochirnij proces printf Hello from the child process n exit EXIT SUCCESS exit nedostupna tut tomu treba vikoristovuvati exit break default Koli fork povertaye dodatne chislo mi u batkivskomu procesi void waitpid pid amp st 0 a znachennya yake povertayetsya ce PID identifikator procesu novostvorenogo dochirnogo procesu break return EXIT SUCCESS Primitki Arhiv originalu za 14 bereznya 2016 Procitovano 13 bereznya 2016 Ken Tompson Dennis Ritchi 3 listopada 1971 PDF UNIX Programmer s Manual angl Bell Labs Arhiv originalu PDF za 3 lyutij 2015 Procitovano 4 berezen 2015 Ritchie Dennis M Thompson Ken July 1978 PDF Bell System Technical Journal AT amp T 57 6 1905 1929 doi 10 1002 j 1538 7305 1978 tb02136 x Arhiv originalu PDF za 10 gruden 2005 Procitovano 22 kvitnya 2014 a rel nofollow class external text href http linux die net man 2 pipe pipe 2 a storinka dovidki man pro sistemni vikliki GNU Linux angl