Sistem Çağrılarının Strace aracı ile izlenmesi
Herkese merhabalar.Öncelikle biraz sistem çağrılarına değinmek istiyorum.Sistem çağrıları (SC), proseslerin (çalışan
programların) OS servislerine erişmelerini sağlayan
programlama ara yüzleridir (API).Yazılımcılar genelde API (Application Programming Interface)’ler kullanarak programlama yaparlar ve bu
API’ler aracılığı ile sistem çağrıları gerçekleştirirler.
En çok kullanılan 3 tip API vardır.
o Win32 API: Windows işletim sistemi üzerindeki
uygulamalarda kullanılır.
o POSIX API: POSIX tabanlı (UNIX, Linux, Mac OS X)
işletim sistemlerindeki uygulamalarda kullanılır.
o Java API: Java Virtual Machine (JVM) üzerinde koşan
uygulamalarda kullanılır.
Biz bugün POSIX API üzerinde yazılmış olan bir uygulamayı inceleyeceğiz.Uygulamamızın içeriği bir dosya(kaynak) içerisindeki içeriği diğer bir dosyanın(hedef) içerisine kopyalanmasıdır.Daha sonrasında strace aracı yardımı ile sistem çağrılarını izleyeceğiz.Strace aracınız yok ise aşağıdaki linkten edinebilirsiniz.Kurulumunu detaylı bir şekilde anlattım :)
https://medium.com/@emreoz37/linux-strace-arac%C4%B1-kurulumu-53ec18242d05
Strace aracının kurulumunu bitirdikten sonra artık sistem çağrılarını incelemeye başlayabiliriz.Öncelikle terminalimizi açıyoruz.Daha sonrasında
çalıştırılacak uygulamamızın adını yazdıktan sonra enter’a basıyoruz ve proses’imizi başlatmış oluyoruz.Şimdi Proses id’imizi almamız gerekiyor.Çünkü Strace aracında sistem çağrılarını çalışan prosesimizin üzerinden inceleyeceğiz.Bunun için yeni bir terminal daha açıyoruz.Daha sonrasında şu komutu yazıyoruz.
ps -A
Resim-2'de sol taraftaki terminalde arkası siyah olan proses bizim uygulamamıza ait olan proses.Baktığımızda ID’sinin 1676 olduğunu görüyoruz.Burada bir not eklemek istiyorum.Yazdığınız uygulama dosyasını compiler ederken verdiğiniz bu isim aynı zamanda sizin prosesinizin ismidir.Unutmamız gereken bir konu ise her çalıştırdığımızda proses Idlerinin farklı olmasıdır.
Proses ID’mizi öğrendikten sonra strace aracında proses çalıştırabilmek için root kullanıcısına geçmemiz gerekiyor.Şu komutu yazıp root kullanıcısına geçiş yapıyoruz.
su
Root kullanıcı şifremizi yazdıktan sonra root kullanıcısına geçiş yapmış oluyoruz.Daha sonrasında ise şu komutu yazıyoruz.
strace -p PROSESID
Strace aracına prosesi belirten -p parametresini verdikten sonra prosesimize ait ID’mizi yazıyoruz ve entera basıyoruz.Eğerki uygulamanızda değer alıyorsanız strace aracı değer almanızı bekliyecektir.
Resimde görüldüğü gibi read sistem çağrısı bizden değer bekliyor.Hemen değerlerimizi verelim.Sizde yazdığınız programda değer girilcek alanlarınızı doldurabilirsiniz.Bütün alanları doldurduktan sonra programımız sonlandırıyoruz.
Prosesimiz bittigi zaman sol taraftaki terminalde uygulamamıza ait sistem çağrılarını görüyoruz.Şimdi bunları inceleyelim.
Write(): Printf ile yazdığımız işlemlerin bu sistem çağrısı ile kullanıldığını görüyoruz.
Read(): Scanf ile yazdığımız işlemlerin bu sistem çağrısı ile kullanıldığını görüyoruz.
Open(): Dosyamızı açmak için yaptığımız işlemler bu sistem çağrısı ile kullanıldığını görüyoruz.
Şimdi şu soruyu sormak istiyorum;
Bu sistem çağrıları birbirinden nasıl ayırt ediliyor?
Bu sorunun cevabını araştırmanız için yanıtlamayacağım :) Sorunuza yardım olabilecek sistem çağrılarına ait standart api dokümanı aşağıya link olarak bırakıyorum.Oradan ulaşabilirsiniz.
Herkese İyi Çalışmalar.