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 pre. Przejdź do terminala za pomocą skrótu Ctrl+Alt+T. Teraz napisz następujące polecenia, aby zainstalować strony podręcznika.
$ sudo apt install 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.
$ sudo apt zainstaluj 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 (ścieżka/plik, argv );Tutaj użyliśmy „unistd.h”, ponieważ zawiera wszystkie informacje o rodzinach funkcji exec.
$ man exec
Teraz na powyższym obrazku możesz zaobserwować rodzaje exec. Oto rodzina funkcji exec. Każdy z nich służy do innej funkcji zgodnie z tą samą zasadą, „exec.”
Przykład: Teraz, idąc dalej, opiszemy funkcjonalność exec na przykładzie. Aby zademonstrować jego działanie, użyjemy jednej funkcji exec, którą jest „execv.” Najpierw utworzymy dwa pliki z rozszerzeniem „.do.” Po ich stworzeniu napiszemy w nich odpowiednie kody i wykonamy je, aby zobaczyć efekt.
Rozważ nazwę pliku „sample4.do". Otwórz go i użyj następującego kodu. W tym kodzie użyliśmy execv w sposób opisany poniżej.
Execv („./sample4copy” , args);Pierwsza część zawiera nową ścieżkę katalogu, a druga część pokazuje tablicę argumentów jako parametr, który przekazaliśmy.
Próbka4.do
Przede wszystkim wydrukowaliśmy identyfikator bieżącego procesu. Po drugie, stworzyliśmy tablicę znaków zawierającą na końcu NULL na zakończenie. Po trzecie, nazwaliśmy funkcję sample4copy.
Próbka4kopia.doKiedy wywołujemy funkcję exec(), zmienia się obraz procesu. Poniżej cytowany obraz poniżej pokazuje kod sample4copy.do.
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.do$ GCC -o sample4copy sample4copy.do
$ ./przykład4
Jak pisaliśmy wcześniej, słowo „GCC” służy do kompilacji kodu, a po kompilacji kod jest wykonywany pomyślnie.
Zgodnie z obrazem, PID próbki4.Plik c jest pokazywany jako pierwszy, ponieważ został zadeklarowany przed wywołaniem exec. Następnie po wywołaniu funkcji exec() obie instrukcje print pliku sample4copy.c jest wykonywane, 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 (nieważny);Możemy skorzystać ze strony podręcznika, aby uzyskać pomoc w użyciu
$ mężczyzna widelec
Przykład: Rozważmy teraz przykład, tworząc plik „sample3.do". Wprowadzimy kod wewnątrz pliku. Zgodnie z kodem ustawiliśmy status widelca jako forkrank.
Próbka3.do
Do zastosowania warunku użyliśmy wyrażenia „if-else”. Zadeklarowano tutaj 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 przyklad3.do$./przykład3
Wynik pokazuje, że proces potomny jest wykonywany wcześniej niż rodzic, gdy czekał proces nadrzędny. Funkcja wait implikuje, że powoduje, że funkcja rodzica czeka, dopóki jeden ze wszystkich procesów potomnych nie zostanie zakończony terminate.
Wywołania systemowe Fork i Exec Wspólnie
Tutaj weźmiemy dwa pliki o nazwie „sample1.c” i „próbka2.do". 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 z 0. Podczas korzystania z wywołania systemowego exec próbka1.c zostanie zastąpiony przez sample2.do.
Próbka1.do
Próbka2.do
Podobnie jak w przykładach omówionych powyżej, plik sample2 będzie zawierał instrukcje printf. W próbce1.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 sample2.plik c zostanie uruchomiony. Dane wyjściowe będą zawierać GCC do skompilowania obu plików. Tutaj przykład nadrzędny1.c id i próbka2.c id jest inne, ponieważ są rodzicem i dzieckiem.
Wniosek
W tym artykule użyliś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.