Yazan : Şadi Evren ŞEKER

Yazılan her program ilk başta tek bir işlem olarak çalışmaya başlar. Temel olarak derlendikten(compile) hemen sonra bağlanarak (link) hafızaya yüklenir (load).

Yüklenen programı, işletim sistemi (operating system) bir işlem (process) olarak çalıştırır. Ancak bazı işlemler yüklendikten ve çalışmaya başladıktan sonra yeni işlemler üretebilirler.

Aslında bu işlem üretme çalışan işlem üzerinde bir çatallanmaya sebep olmak demektir. Bu çatallanmayı destekleyen dillerde bu iş için özel fonksiyonlar bulunur. Örneğin C dilindeki fork() fonksiyonu bu amaçla geliştirilmiştir.

C dilinde yazdığımız bir programda daha önceden yazılmış ve işletim sisteminde bulunan (tercihen linux) “ls” komudunu çağıracağımızı düşünelim.

#include<stdio.h>
int main()
{
    int pid;
    pid=fork();
    if(pid=-1)
    {
        printf("n Çatallamada hata oldu");
        exit(0);
    }
    if(pid==0)
    {
        printf("n Çocuk işlem......");
        execlp("/bin/ls","ls",NULL);
    }
    else
    {
        printf("n Ata işlem");
        wait(pid);
        printf("Tamamlandı");
        exit(0);
    }
}

Yukarıdaki kodda önce bir fork fonksiyonu çağrılmış ardından if kontrolleri ile fork fonksiyonundan dönen integer değer kontrol edilmiştir. Bunun anlamı aslında çalışan işlemin (process) kopyalanmasıdır. Yani fork fonksiyonu çağrılınca aynı programdan iki kopya hafızada çalıştırılır. Arada tek fark fork fonksiyonundan dönen değerdir. Basitçe çocuk işlemde (child process) dönen değer 0 iken ata işlemde(parent process) dönen değer 1’dir.

Şayet fork işleminde bir hata olursa dönen değer -1 olur, bunu hata kontrolü için yukarıda da gösterildiği üzere kullanabiliriz.

Yorumlar

  1. hakan

    merhaba, ben bu kodu cde yazdım ve linuxde çalıstrayım dedim çatallanma oldu diye hata verdi ne yapmam gerek acaba hocam?

  2. Şadi Evren ŞEKER Article Author

    sanırım bahsettiğiniz hata, kodun içerisindeki “çatallanmada hata oldu” mesajı. Bu durumda fork() fonkisyonu -1 döndürmüş demektir bu da hata oldu ve işlem (process) oluşturulamadı anlamına gelir.

    Hatanın sebebini bulmak için genelde /var/log altına bakmak gerekir. Genel olarak hafıza problemi veya işlem oluşturma yetkinizin bulunup bulunamaması olarak yaşanır.

  3. hakan

    peki hocam ben bunu kavradım ama named pipe diye bir konu daha var orada tam olarak amacımız nedir? ve 2 console gerekiyor sanırım bu konuya açıklık getirmek için. integer degeri nasıl bu named pipe’da tanıtıcaz?

  4. Koray

    Merhabalar , C de yapmam gereken bir program varda bunun hakkında yardımcı olabilir misiniz ?

    Question : Write a C program (without #includes) that spawns a child process in which it executes the external command ls -a -lh .

  5. Şadi Evren ŞEKER Article Author

    Sorunuzda, ls -a -lh komutunu C dilinde çalıştıran bir program yazmanız istenmiş.

    Sorunun cevabı yukarıdaki yazıda zaten bulunuyor ancak parametreler için execlp fonksiyonunun son kısmını kullanmanız gerekir. İlgili satırı, sorunuzun cevabı olacak şekilde yeniden yazıyorum :

    execlp(“/bin/ls”,”ls”,”-l”,”-lh”,NULL);

    Diğer satırlar aynı kalabilir. Yukarıdaki komut, yeni parametreler ile birlikte ls komutunu çalıştırır. execlp fonksiyonu, parametreleri liste şeklinde alırken, parametrelerin bitimini belirten bir NULL, listenin sonuna konulmalıdır.

hakan için bir cevap yazın Cevabı iptal et

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir