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.
$ sudo apt install manpages-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.
$ sudo apt GCC'yi kurun
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
Exec (yol adı/dosya, argv);Burada “unistd.h” başlığı, exec işlevi ailelerinin tüm bilgilerini içerdiğinden.
$ adam yürütme
Şimdi yukarıda belirtilen görüntüde, yürütme türlerini gözlemleyebilirsiniz. Bunlar, exec işlevleri ailesidir. Her biri aynı temeli izleyen farklı bir işlev içindir, “exec.”
Misal: Şimdi, daha da ileri giderek, bir örnek yardımıyla exec'in işlevselliğini açıklayacağız. Çalışmasını göstermek için "execv" olan bir exec işlevini alacağız.” İlk olarak “ uzantılı iki dosya oluşturacağız.c.” Oluşturulduktan sonra ilgili kodları içlerine yazacağız ve sonucu görmek için çalıştıracağız.
Bir dosya adı düşünün “örnek4.c”. 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”, bağımsız değişkenler);İ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üsü, sample4copy işlevini çağırdık.
Örnek4kopya.cexec işlevini() çağırdığımızda, süreç görüntüsü değiştirilir. Aşağıda belirtilen resim, sample4copy kodunu gösterir.c.
Burada, mevcut işlemin kimliğini almak için yalnızca print ifadelerini kullandık.
İlgili kodların çıktısı aşağıdaki komutlar kullanılarak alınabilir.
$ GCC-o örnek4 örnek4.c$ GCC -o sample4copy sample4copy.c
$ ./örnek4
Daha önce açıkladığımız gibi, kodu derlemek için “GCC” kelimesi kullanılır ve derlendikten sonra kod başarıyla yürütülür.
Resme göre, sample4'ün PID'si.c dosyası, exec çağrısından önce bildirildiği için ilk önce gösterilir. Daha sonra exec() işlevi çağrıldıktan sonra, sample4copy dosyasının hem print deyimleri.c, işlemin kimliğini elde etmek için getpid() öğesinin kullanıldığı yerde yürütülür.
c de çatalla kodlama
fork() işlevi, ana süreçten alt süreci oluşturur. Ayrıca içindeki çatal bilgileri de dahil olmak üzere iki başlık içerir.
Sözdizimi:
Pid_t çatalı(void);Kullanımda yardım için man sayfasını kullanabiliriz
$ adam çatal
Misal: Şimdi bir “sample3” dosyası oluşturarak bir örnek düşünün.c”. Kodu dosyanın içine gireceğiz. Koduna göre fork durumunu forkrank olarak belirledik.
Örnek3.c
Koşulu 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ıldığı gibi 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” adında iki dosya alacağız.c” ve “örnek2.c”. İlk önce sampl1 dosyasını açın.c ve aşağıdaki resimde 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ını kullanırken, örnek1.c sample2 ile değiştirilecektir.c.
Örnek1.c
Örnek2.c
Yukarıda tartışılan örneklere benzer şekilde, sample2 dosyası içinde printf deyimlerini içerecektir. örnek1'de.c, önce ilk yazdırma komutu yürütülür, ardından çatal işlevi çağrılır, p== 0 olduğunda alt kısım yürütülür ve örnek2.c dosyası çalıştırılacak. Çıktı, her iki dosyayı da derlemek için GCC içerecektir. Burada ebeveyn örneği1.c kimliği ve örnek2.c kimliği farklıdır çünkü onlar ebeveyn ve çocuktur.
Sonuç
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.