Proseslerde Bekleme, Askıya Alma, Sonlanma ve Sinyal Çağrıları

Yazar:




Oluşturduğumuz prosesler veya mevcut proseslere, bazı sistem çağrıları ile istediğimiz yaptırabiliyoruz. Bugün ise başlıktan da anlayacağınız üzere "Bir Prosesi Öldürme, Bekletme, Uykuya Alma ve Yeniden Başlatma" çağrılarını tanıtacağım kısaca.

Kodlar, kütüphaneler C dili kütüphaneleridir. Çağrıları ise Linux işletim sistemine ait sistem çağrılarıdır.

Bekleme ve Sonlanma Çağrıları

Bu çağrıları kullanabilmek için derleyicimize,

#include <sys/types.h>
#include <sys/wait.h>

kütüphanelerini eklememiz gerekiyor.

Sleep() Çağrısı

Herhangi prosesi, parantezler içerisine yazacağımız saniye kadar bekletebiliriz. Hangi prosesi bekleteceğiniz ise tamamen size kalmış. Mesela çocuk proses aktif olacağı sırada ben program koduma sleep(1) yazdım diyelim. Bu durumda çocuk prosese sıra geldiği zaman çocuk proses çalışmayacak. 1 saniye bekleyecek. Bu sırada başka proseslerin işleri varsa onlar işlerini yaparlar ve 1 saniye sonra çocuk proses yeniden aktif olur. Yani sleep(1) yaparak istediğimiz herhangi bir prosesi 1 saniyeliğine uyutmuş oluruz. Eğer ki sleep(5) yazarasak, o anda aktif olan proses 5 saniyeliğine uyku moduna geçer ve bu süre dolana kadar da aktif olmaz. Süre dolduktan sonra tekrar kendiliğinden uyanır ve işlemlerine devam eder. Bilgisayardaki işlemler milisaliseler içerisinde gerçekleştiği için 1 bile saniye aslında önemli bir zaman aralığıdır.


Wait() ve Waitpid() Çağrıları

Bu ifadeyi aktif olan proses içine yazdığımız zaman o proses, herhangi bir alt prosesin işlemini bitirmesi için bekler. Sonlanmadığı için programı da sonlandırmaz. Yani proses vardır ama işlem yapmıyordur diyebiliriz. Diğer prosesin işini yapmasını bekler. İpliklerde pthread_join() ifadesi bu görevi görüyordu. Proseslerde ise wait() ve waitpid() çağrıları bu görevi yapar.

wait(int *durum) şeklinde tek bir parametre alır içine. Bu parametre adres tutar. Beklenen proses sonlandığında, sonlanan bu prosesin çıkış değerini tutar. wait() çağrısı, waitpid() çağrısının eski versiyonudur.

Waitpid(pid_t pid, int *durum, int secenekler); şeklinde 3 parametre alır.
Birinci parametreye bekletmek istediğimiz prosesin ID numarasını yazıyoruz.

1. parametre : Hangi prosesi bekleyeceksek onun ID'sini yazıyoruz. Herhangi bir çocuk proses beklenecekse ilk parametreye "-1" değeri girilir.
2. parametre : Bu parametre adres tutar. Beklenen proses sonlandığında int *durum olarak belirttiğimiz ikinci parametre ifadesi, sonlanan bu prosesin çıkış değerini tutar.
3. paramtere : Özellikler parametresidir. "0" veya bazı özel değerler alır. Sıfır yazmadığımız durumlarda alabileceği bu bazı özel değerlerin 3 tanesine bakalım :

WNOHANG     : Hiçbir çocuk proses sonlanmıyorsa hemen geri dönmeyi belirtir.
WUNTRACED : Çocuk proses durdurulduğunda geri dönülecektir.
WCONTINUED:Durdurulan çocuk proses SIGCONT sinyali aldığında geri döner.



SİNYAL ÇAĞRILARI


Buraya kadar yazdıklarım Bekleme ve Sonlanma Çağrıları'ydı. Şimdi ise proseslerdeki bazı sinyal alma çağrılarına bakalım.

Sinyal çağrıları içi kullanılması gereken kütüphane;
#include <signal.h>

Sinyal çağrılarından sadece kill() ifadesine değineceğim için en başından şunu belirtmeliyim ki bu çağrı;

kill(pid_t pid, int signal);

olmak üzere 2 parametre alır. İlk parametre proses ait bilgileri tutar. İkinci parametre ise sinyal bilgisini tutar. O proses ne yaptırmak istiyorsak, signal kısmına o sinyalin adını yazmamız gerekiyor. Alttaki ifadelerden de ne demek istediğimi daha iyi anlayacaksınız.

pid_t prosesID; //olsun.
prosesID = fork(); //çocuk prosesin bilgileri artık "prosesID" ifadesi içinde saklanıyor.

Artık "prosesID" ifadesini kullanarak, çocuk prosese kill() aracılığıyla istediğimiz sinyali uygulayabiliriz.

kill(prosesID,SIGSTOP) ve kill(prosesID,SIGCONT) Çağrıları

Bu ifadeler sayesinde, ID numarasını bildiğimiz bir prosesin işlemini istediğimiz zaman sonlandırıp, istediğimiz zaman yeniden aktif edebiliyoruz. Mesela şöyle bir örnek vereyim. Çocuk prosesin ID numarasının "prosesID" olduğunu varsayalım. Ben kill(prosesID,SIGSTOP) ifadesini kullanırsam eğer, çocuk proses duracaktır ve hiçbir iş yapamayacaktır. Taa ki biz yeniden kendisini aktif edene kadar. kill(f,SIGCONT) ifadesi ise işte burada devreye giriyor. SIGSTOP komutu ile işlem yapmasını durdurduğumuz bir prosesi SIGCONT komutu ile istediğimiz zaman yeniden aktif hale yani iş yapabilir hale getirebiliyoruz.



kill(prosesID,SIGKILL) Çağrısı

Bu ifade ile ID numarasını bildiğimiz bir prosesi istediğimiz zaman öldürebiliyoruz. Öldürdüğümüz proses bir daha işlem yapamaz ve eğer ana proses ile programın sonlanmasına sebep olur. Öldürmek istediğimiz ana prosesin ID numarasının "prosesID" olduğunu varsayalım. Bu durumda kill(f,SIGKILL) olarak kullanılır bu ifade.


Derlediğiniz programda ID numarası yazılması gereken kısım olan "prosesID" kısmında "getpid()" ifadesini kullanabilirsiniz.
  • kill(getpid(),SIGSTOP)
  • kill(getpid(),SIGCONT)
  • kill(getpid(),SIGKILL)
vs. gibi.


Bu konuyla ilgili anlatacaklarım bu kadar. Konuyla ilgili aklınıza takılan tüm soru, öneri, ve isteklerinizi aşağıdaki yorum formundan belirtebilirsiniz.

0 yorum:

Yorum Sayfası :


Yorum formuna konuyla ilgili görüş ve sorularınızı bırakabilirsiniz.

Yorumunuza mümkün olan en kısa sürede dönüş yapılacağından emin olabilirsiniz.


Eklenen yorumlar, moderatör onayından sonra yayınlanmaktadır.

İstatistikler

BLOGKAFEM.NET © Copyright 2008-2023
Sitedeki yazıların her hakkı BLOGKAFEM.NET sitesine aittir.
Kopyalanması halinde lütfen kaynak gösteriniz.
DMCA.com Protection Status
Anasayfa | Hakkında | İletişim