C POSIX library etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
C POSIX library etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

Linux'te execl ile dosya çalıştırma


execl fonksiyonunu çağırdığımız anda parametre olarak verdiğimiz çalıştırılabilir dosya execute edilir ve program bu yeni process'e dönüşür. 


Aşağıda programda process fork edilip child process'i /bin/ls process'ine dönüştürülmektedir.


Çıktılardan istenilen sonuçların elde edildiği görülmektedir.



Linux'te child process oluşturma


Linux'te child process oluşturmak için ilk aşama fork fonksiyonunun çağrılmasıdır. 


 fork çağrıldığı anda processin bir kopyasını oluşturur. Genelde fork exec'le beraber kullanılarak ikinci bir process oluşturmak için kullanılır. Linux sistemlerde process oluşturmanın yolu fork ve ardından exec fonksiyonunu çağırmaktır. fork fonksiyonunun geri dönüş değeri 0'a eşitse child process anlamına gelmektedir. child process'in  bir process id'si bulunmaktadır ve bu process id'si fork fonksiyonunun geri dönüş değeri olan değer değildir.  Bu ikisi karıştırılmamalıdır.



Yukarıdaki basit kodun çıktısı aşağıdaki gibidir. Görüleceği üzere child process'in parent id'si fork işlemi yapılan processin id'si fork işlemi yapılan process'in id'si de bash programının process id'sine eşit olduğu ps -aux ile net bir şekilde incelenebilir.


Umask Fonksiyonu


umask user mask  kelimelerinden türetilmiştir. Dosya oluştururken hangi haklarla oluşturulacağını ayarlayan C POSIX fonksiyonudur. Kısaca fonksiyon 0777 ile mask değerini logical and (&) işlemine sokar.



umask(0) demek oluşturulan dosya tüm gruplar için  rwx haklarına sahip olacağını ( u=rwx, g=rwx, o=rwx ) umask(777) ile ise hiçbir hakka ( u=, g=, o= ) sahip olunmayacağını belirtir.



Aşağıda görüldüğü gibi umask değerinin değiştirmezsek user için rwx diğerleri için hiçbir hakka sahip olmadan oluşturduğu gözükür.


Bu işlemin benzerlerinin shell üzerinden de aşağıdaki şekilde yapılabilir.



umask -S ile oluşturulacak dosyaların hangi haklarla oluşturulacağını u(ser), g(roup), o(ther) belirtir.

C'de opendir-readdir-closedir Fonksiyonları



  • opendir: Dosya açma
  • readdir: Dosya okuma
  • closedir: Dosya kapama


Öncelikler Linux sistemlerde (Sistem programlamada) dosya kavramı normal dosyalar ve dizinleri de içerecek şekilde kullanılmaktadır. Basit bir klasör listeleme programı aşağıdaki gibi yazılacaktır:



opendir ile dosya açılır ardından readdir ile içinde bulunan dosyalar okunur.


readdir fonksiyonunun geri dönüş değeri struct dirent pointer türündendir. 


Dosyaları listelemede filtreleme yapmak istersek aşağıdaki örnekten faydalanılabilir.


Dosyaların isimlerine ve diğer bilgilerine ent->d_name ile ulaşılır. struct dirent içinde başka bir çok bilgi bulunmaktadır. istediğimiz bilgileri ekrana yazdırabiliriz.

Bizim programın çıktısı aşağıdaki gibi olmuştur:



C' de fork ve exec Kavramı


fork()

fork fonksiyonu bir process'in bire bir kopyasını oluşturmak için kullanılır. fork işlevi işletim sisteminde thread kavramı olmadan önce işletim sisteminin çalışma zamanından daha fazla kazanmak için kullanılmaktaydı. Fork işlemi ile aynı process'ten birden fazla oluşturularak işlemler daha kısa zamanda yapılması sağlanmaktaydı.


 fork fonksiyonu çağrıldığı zaman child process id'si sıfır ile parent process id'si sıfır dışı değerle yukarıdaki gibi kontrol edilerek istenilen kodların çalıştırılması sağlanır.


 fork fonksiyonun hala kullanıldığı ikinci kısım ise bir proces çalışma anında başka bir process'i daha çalıştırmak isterse bu durumda yapması gereken şey process'in bir kopyasını oluşturmak ve child veya parent process'i çalıştırılmak istenen process haline getirmek.bu işlevin ikinci kısmı içinde exec fonksiyonu kullanılmaktadır.

execl()

execl fonksiyonunun çalışma mantığı fonksiyon çağrıldığı anda fonsiyonun parametre ifadesinde girilen fonksiyon çalışmaya başlayacak ve o process artık çağrılan process olarak yaşamına devam edecek. Kısaca artık execl fonksiyonunun altında olan kodların o process için çalışması mümkün olmayacak.


kısaca fork fonksiyonun process'in bir klonunun oluştururken exec process'i mutasyona uğratıp başka bir process olarak çalışmasını sağlayacaktır.


Yukarıda hem fork hem de exec işlemi gerçekleştirilmiştir. önce fork ie iki tane process oluşturulmuş ardından child process exec ile main process'ine dönüşmüş parent process ise çalışmasına devam etmiştir.