c'de örnek olarak fork ve exec ile kodlama

Coding With Fork Exec Example C



Yazımızın başlığı, sistemimizde herhangi bir programı çalıştırırken oluşan C dilinin iki farklı fonksiyonunu içermektedir. Ne yazık ki, C'de aynı anda birden fazla programın meydana gelme olasılığı sıfırdır. Belirli bir zamanda yalnızca tek bir görev gerçekleşebilir, bu da eşzamanlı programların çalışmasına izin vermediği anlamına gelir. Bir işlemin tamamlanmasını diğerini yürütmek için beklemenize neden olur. Bu sorun giderme probleminden kaçınmak için programınızı iyi bir şekilde geliştirmeniz, iyi bir geliştirici olmanız gerekebilir. Linux fork (), sisteminizde beklemeyi aşmak ve eşzamanlılık sağlamak için kullanılır. Yeni bir işlemin çoğaltılmasına yardımcı olur ve çoğaltılan işlemi çağırarak yeni bir tane oluşturur. Yeni süreç alt süreç, önceki süreç ise ana süreç olarak adlandırılır.

Oysa mevcut programı yenisiyle değiştirmek için exec () işlevi kullanılır. Bu değiştirme, bir programın veya dosyanın içeriğinde değişiklik yapılarak yapılır. Bu nedenle, fork ve exec arasındaki fark, fork'un mevcut süreçten yeni bir süreç oluşturması ve exec'in mevcut programı yeni bir program oluşturarak değiştirmek için kullanılmasıdır.







Önkoşullar

Linux sisteminizde herhangi bir c programını çalıştırmak için, üzerine bazı önkoşullar yüklememiz gerekiyor. Ctrl+Alt+T kısayol yöntemini kullanarak terminale gidin. Şimdi man sayfalarını kurmak için aşağıdaki komutları yazın.



$sudouygunYüklemekmanpages-dev



İlgili tüm sayfaları yükleyecektir.





İleriye dönük olarak, Linux'ta bir program çalıştırmak için bir kod derleyici kurmanız gerekir. Kodu derlemek ve yürütmek için kullanılır. Bu amaçla sistemimize GCC depoları kuracağız.

$sudouygunYüklemekKİK



c'de exec ile kodlama

Man sayfalarını Linux'a yüklediğimiz için, exec ile ilgili açıklamayı görmek için aşağıdaki komutu kullanacağız. Birincil örnek sözdizimi aşağıdaki gibidir:

Sözdizimi

Yürütme(yol adı/dosya, argv);

Burada, exec işlevi ailelerinin tüm bilgilerini içerdiği için unistd.h başlığını kullandık.

$adam yürütmek

Şimdi yukarıda belirtilen görüntüde, yürütme türlerini gözlemleyebilirsiniz. Bunlar, yürütme işlevleri ailesidir. Her biri aynı tabanı izleyen farklı bir işlev içindir, exec.

Örnek: Şimdi daha da ileri giderek, bir örnek yardımıyla exec'in işlevselliğini anlatacağız. Çalışmasını göstermek için exec'in bir işlevi olan execv'i alacağız. Öncelikle .c uzantılı iki dosya oluşturacağız. Oluşturulduktan sonra ilgili kodları içlerine yazacağız ve sonucu görmek için çalıştıracağız.

Örnek4.c dosya adını düşünün. Lütfen açın ve aşağıdaki kodu kullanın. Bu kodda, aşağıda belirtilen belirli bir şekilde execv kullandık.

Yürütme(./sample4copy , argümanlar);

İlk kısım yeni dizin yolunu içerir ve ikinci kısım, geçtiğimiz bir parametre olarak argümanlar dizisini gösterir.

Örnek4.c

Her şeyden önce, mevcut işlemin kimliğini yazdırdık. İkinci olarak, sonlandırma için sonunda NULL olan bir karakter dizisi oluşturduk. Üçüncü olarak, sample4copy işlevini çağırdık.

Sample4copy.c

exec işlevini() çağırdığımızda, süreç görüntüsü değiştirilir. Aşağıdaki alıntılanan resim, sample4copy.c kodunu gösterir.

Burada, mevcut işlemin kimliğini almak için yalnızca print deyimlerini kullandık.

İlgili kodların çıktısı aşağıdaki komutlar kullanılarak alınabilir.

$ GCC–o numune4 numune4.c
$ GCC –o sample4copy sample4copy.c
$./örnek4

Daha önce açıkladığımız gibi, GCC kelimesi kodu derlemek için kullanılır ve derlendikten sonra kod başarıyla yürütülür.

Görüntüye göre, exec çağrısından önce bildirildiği için sample4.c dosyasının PID'si ilk olarak gösterilir. Daha sonra exec() işlevi çağrıldıktan sonra, işlemin kimliğini elde etmek için getpid()'in kullanıldığı yerde sample4copy.c dosyasının her iki print ifadesi de yürütülür.

c de çatalla kodlama

fork() işlevi, ana süreçten alt süreci oluşturur. Ayrıca fork bilgisi de dahil olmak üzere iki başlık içerir.

Sözdizimi:

Pid_t çatalı(geçersiz);

Kullanımda yardım için man sayfasını kullanabiliriz

$adamçatal

Örnek: Şimdi bir sample3.c dosyası oluşturarak bir örnek düşünün. Kodu dosyanın içine gireceğiz. Kodlara göre fork durumunu forkrank olarak belirledik.

Örnek3.c

Koşulları uygulamak için if-else ifadesini kullandık. Burada fork() kavramının anlaşılmasına yardımcı olmak için basit yazdırma komutları bildirilmiştir. Forkrank önce 0, sonra -1 olarak bildirilir. Bir çatal() ile artık aynı anda çalışan iki süreç vardır. Çıktı, yukarıda exec örneğinde kullanılanla aynı kod kullanılarak elde edilebilir.

$ GCC –o örnek3.c
$./örnek3

Çıktı, ana süreç beklerken alt sürecin ebeveynden daha önce yürütüldüğünü gösterir. Wait işlevi, tüm alt süreçlerden biri sonlandırılmadığı sürece üst işlevin beklemesine neden olduğunu ima eder.

Fork ve Exec sistemi toplu olarak çağırır

Burada sample1.c ve sample2.c adlı iki dosya alacağız. Öncelikle sampl1.c dosyasını açın ve aşağıdaki görsele eklenen kodu yazın. Burada fork() sistem çağrısını kullandık; alt süreç oluşturulduğunda, p, 0 ile atanacaktır. exec sistem çağrısı kullanılırken, sample1.c, sample2.c ile değiştirilecektir.

Örnek1.c

Örnek2.c

Yukarıda tartışılan örneklere benzer şekilde, sample2 dosyası içinde printf deyimlerini içerecektir. sample1.c'de önce ilk print komutu çalıştırılır, ardından fork fonksiyonu çağrılır, p== 0 olduğunda alt kısım çalıştırılır ve sample2.c dosyası çalıştırılır. Çıktı, her iki dosyayı da derlemek için GCC içerecektir. Burada ebeveyn numune1.c kimliği ve numune2.c kimliği farklıdır, çünkü bunlar ebeveyn ve çocuktur.

Çözüm

Bu yazıda kullanımı ve konsepti kolayca anlamak için hem fork hem de exec'i ayrı ayrı ve toplu olarak kullandık. Umarım bu eğitim, bilginizi artırmada erişime yol açacak yeterli içerik içerir.