Kodowanie za pomocą fork i exec na przykładzie w c

Coding With Fork Exec Example C



Tytuł naszego artykułu zawiera dwie różne funkcje języka C, które występują podczas uruchamiania dowolnego programu w naszym systemie. Niestety nie ma możliwości wystąpienia więcej niż jednego programu na raz w C. Tylko jedno zadanie może się zdarzyć w określonym czasie, co oznacza, że ​​nie pozwala to na jednoczesne uruchamianie programów. Powoduje to, że czekasz na zakończenie jednego procesu, aby wykonać drugi. Aby uniknąć tego problemu z rozwiązywaniem problemów, być może będziesz musiał opracować swój program we właściwy sposób, będąc dobrym programistą. Widelec Linuksa () służy do przezwyciężenia oczekiwania i umożliwienia współbieżności w systemie. Pomaga w duplikowaniu nowego procesu i tworzy nowy, wywołując zduplikowany proces. Nowy proces jest procesem potomnym, a poprzedni nazywany jest procesem nadrzędnym.

Natomiast funkcja exec() służy do zmiany istniejącego programu na nowy. Ta zamiana odbywa się poprzez wprowadzenie poprawek w treści programu lub pliku. Zatem różnica między fork i exec polega na tym, że fork tworzy nowy proces z istniejącego procesu, a exec służy do zastąpienia istniejącego programu poprzez utworzenie nowego.







Warunki wstępne

Aby uruchomić dowolny program w c w systemie Linux, musimy zainstalować na nim pewne wymagania wstępne. Przejdź do terminala za pomocą skrótu Ctrl+Alt+T. Teraz napisz następujące polecenia, aby zainstalować strony podręcznika.



$sudotrafnyzainstalowaćmanpages-dev



Zainstaluje wszystkie odpowiednie strony.





Idąc dalej, aby uruchomić program w systemie Linux, musisz zainstalować kompilator kodu. Służy do kompilacji kodu i wykonania go. W tym celu zainstalujemy w naszym systemie repozytoria GCC.

$sudotrafnyzainstalowaćGCC



Kodowanie z exec w c

Ponieważ zainstalowaliśmy strony podręcznika w systemie Linux, użyjemy następującego polecenia, aby zobaczyć opis dotyczący exec. Podstawowa składnia próbki jest następująca:

Składnia

Exec(nazwa ścieżki/plik, argv);

Tutaj użyliśmy nagłówka unistd.h, ponieważ zawiera on wszystkie informacje o rodzinach funkcji exec.

$facet exec

Teraz na powyższym obrazku możesz zaobserwować typy exec. Oto rodzina funkcji exec. Każdy z nich służy do innej funkcji o tej samej podstawie, exec.

Przykład: Teraz, idąc dalej, opiszemy funkcjonalność exec na przykładzie. Aby zademonstrować jego działanie, wykorzystamy jedną funkcję execv. Najpierw utworzymy dwa pliki z rozszerzeniem .c. Po ich utworzeniu napiszemy w nich odpowiednie kody i wykonamy je, aby zobaczyć efekt.

Rozważ nazwę pliku sample4.c. Otwórz go i użyj poniższego kodu. W tym kodzie użyliśmy execv w sposób podany poniżej.

Execv(./sample4copy , args);

Pierwsza część zawiera nową ścieżkę katalogu, a druga część pokazuje tablicę arguments jako parametr, który przekazaliśmy.

Próbka4.c

Przede wszystkim wydrukowaliśmy identyfikator bieżącego procesu. Po drugie, stworzyliśmy tablicę znaków zawierającą na końcu NULL dla zakończenia. Po trzecie, wywołaliśmy funkcję sample4copy.

Sample4copy.c

Kiedy wywołujemy funkcję exec(), zmienia się obraz procesu. Poniżej cytowany obraz poniżej pokazuje kod sample4copy.c.

Tutaj użyliśmy tylko instrukcji print, aby uzyskać identyfikator bieżącego procesu.

Dane wyjściowe odpowiednich kodów można uzyskać za pomocą następujących poleceń.

$ GCC–o próbka4 próbka4.c
$ GCC –o sample4copy sample4copy.c
$./próbka4

Jak pisaliśmy wcześniej, do kompilacji kodu używane jest słowo GCC, a po kompilacji kod jest wykonywany pomyślnie.

Zgodnie z obrazem, PID pliku sample4.c jest wyświetlany jako pierwszy, ponieważ został zadeklarowany przed wywołaniem exec. Następnie po wywołaniu funkcji exec() wykonywane są obie instrukcje print pliku sample4copy.c, gdzie getpid() jest używane do uzyskania identyfikatora procesu.

Kodowanie widelcem w c

Funkcja fork() tworzy proces potomny z procesu nadrzędnego. Zawiera również dwa nagłówki, w tym zawarte w nim informacje o rozwidleniu.

Składnia:

Widelec Pid_t(próżnia);

Możemy skorzystać ze strony podręcznika, aby uzyskać pomoc w użyciu

$facetwidelec

Przykład: Rozważmy teraz przykład, tworząc plik sample3.c. Wprowadzimy kod wewnątrz pliku. Zgodnie z kodem ustawiliśmy status widelca jako forkrank.

Próbka3.c

Użyliśmy instrukcji if-else, aby zastosować warunek. W tym miejscu zadeklarowano proste polecenia drukowania, aby pomóc w zrozumieniu koncepcji fork(). Forkrank jest najpierw deklarowany jako 0, a następnie -1. Dzięki fork() są teraz dwa procesy, które działają jednocześnie. Dane wyjściowe można uzyskać za pomocą tego samego kodu, jak w powyższym przykładzie exec.

$ GCC –o sample3.c
$./próbka3

Dane wyjściowe pokazują, że proces potomny jest wykonywany wcześniej niż rodzic, gdy czekał proces nadrzędny. Funkcja oczekiwania implikuje, że powoduje, że funkcja nadrzędna czeka, dopóki jeden ze wszystkich procesów potomnych nie zostanie zakończony.

Wywołania systemowe Fork i Exec Wspólnie

Tutaj weźmiemy dwa pliki o nazwach sample1.c i sample2.c. Najpierw otwórz plik sampl1.c i napisz kod, który jest dołączony poniżej na obrazku. Użyliśmy tutaj wywołania systemowego fork(); kiedy proces potomny jest tworzony, p zostanie przypisane 0. Podczas używania wywołania systemowego exec, sample1.c zostanie zastąpione sample2.c.

Próbka1.c

Próbka2.c

Podobnie do przykładów omówionych powyżej, plik sample2 będzie zawierał w sobie instrukcje printf. W sample1.c pierwsze polecenie drukowania jest wykonywane jako pierwsze, następnie wywoływana jest funkcja fork, gdy p== 0, następnie wykonywana jest część potomna i uruchamiany jest plik sample2.c. Dane wyjściowe będą zawierać GCC do skompilowania obu plików. W tym przypadku identyfikator nadrzędny próbki1.c i identyfikator próbki2.c różnią się, ponieważ są rodzicami i dziećmi.

Wniosek

W tym artykule wykorzystaliśmy zarówno fork, jak i exec osobno i łącznie, aby łatwo zrozumieć użycie i koncepcję. Mam nadzieję, że ten samouczek zawiera wystarczającą ilość treści, które umożliwią dostęp do eskalacji Twojej wiedzy.