Chciałem znaleźć różnicę między tymi czterema w Google i spodziewałem się, że będzie wiele informacji na ten temat, ale tak naprawdę nie było żadnego solidnego porównania między czterema połączeniami.
Próbowałem skompilować rodzaj podstawowego spojrzenia na różnice między tymi wywołaniami systemowymi i oto, co otrzymałem. Czy wszystkie te informacje są prawidłowe / czy brakuje mi czegoś ważnego?
Fork
: Wywołanie rozwidlenia zasadniczo tworzy duplikat bieżącego procesu, identyczny pod każdym względem (nie wszystko jest kopiowane, na przykład limity zasobów w niektórych implementacjach, ale pomysł polega na stworzeniu jak najbliższej kopii).
Nowy proces (podrzędny) otrzymuje inny identyfikator procesu (PID) i ma PID starego procesu (nadrzędnego) jako nadrzędny PID (PPID). Ponieważ oba procesy działają teraz dokładnie w tym samym kodzie, mogą stwierdzić, który jest kod powrotu rozwidlenia - dziecko otrzymuje 0, rodzic otrzymuje PID dziecka. To wszystko oczywiście przy założeniu, że wywołanie fork działa - jeśli nie, nie zostanie utworzone żadne dziecko, a rodzic otrzyma kod błędu.
Vfork
: Podstawową różnicą między vfork a fork jest to, że gdy nowy proces jest tworzony za pomocą vfork (), proces nadrzędny jest tymczasowo zawieszony, a proces potomny może pożyczyć przestrzeń adresową rodzica. Ten dziwny stan rzeczy trwa do momentu, gdy proces potomny albo wyjdzie, albo wywoła execve (), w którym to momencie proces macierzysty jest kontynuowany.
Oznacza to, że proces potomny vfork () musi zachować ostrożność, aby uniknąć nieoczekiwanej modyfikacji zmiennych procesu macierzystego. W szczególności proces potomny nie może powracać z funkcji zawierającej wywołanie vfork () i nie może wywoływać exit () (jeśli musi wyjść, powinien użyć _exit (); w rzeczywistości dotyczy to również dziecka normalnego widelca ()).
Exec :
Wywołanie exec jest sposobem na zastąpienie całego bieżącego procesu nowym programem. Ładuje program do bieżącej przestrzeni procesu i uruchamia go od punktu wejścia. exec () zastępuje bieżący proces plikiem wykonywalnym wskazanym przez funkcję. Kontrola nigdy nie wraca do oryginalnego programu, chyba że wystąpi błąd exec ().
Clone :
Klon, jako widelec, tworzy nowy proces. W przeciwieństwie do fork, wywołania te pozwalają procesowi potomnemu na dzielenie się częściami jego kontekstu wykonawczego z procesem wywoływania, takim jak przestrzeń pamięci, tabela deskryptorów plików i tabela procedur obsługi sygnałów.
Gdy proces potomny jest tworzony za pomocą klonowania, wykonuje aplikację funkcji fn (arg). (Różni się to od fork, gdzie wykonywanie jest kontynuowane w potomku od momentu pierwotnego wywołania fork). Argument fn jest wskaźnikiem funkcji, która jest wywoływana przez proces potomny na początku jego wykonywania. Argument arg jest przekazywany do funkcji fn.
Gdy aplikacja funkcji fn (arg) powraca, proces potomny zostaje zakończony. Liczba całkowita zwracana przez fn jest kodem wyjścia dla procesu potomnego. Proces potomny może także zostać jawnie zakończony przez wywołanie exit (2) lub po odebraniu krytycznego sygnału.
Otrzymane informacje:
- Różnice między fork i exec
- http://www.allinterview.com/showanswers/59616.html
- http://www.unixguide.net/unix/programming/1.1.2.shtml
- http://linux.about.com/library/cmd/blcmdl2_clone.htm
Dziękuję za czas poświęcony na przeczytanie tego ! :)
fork()
w Linuksie i prawdopodobnie we wszystkich BSD) pożycza przestrzeń adresową swojego rodzica. Wszystko, co robi, oprócz dzwonienia execve()
lub _exit()
, ma ogromny potencjał, aby zepsuć rodzica. W szczególności exit()
programy atexit()
obsługi połączeń i inne „finalizatory”, np .: opróżniają strumienie standardowego przekazu. Powrót od vfork()
dziecka może (podobnie jak poprzednio) zepsuć stos rodzica.
fork
syscall?