Linux'ta Sistem Çağrısı Nedir ve Örneklerle Nasıl Çalışır?

What Is System Call Linux



Sistem çağrısı, bir işlemin Linux çekirdeği ile iletişim kurmasını sağlayan bir işlevdir. Bu, bir bilgisayar programının işletim sisteminin çekirdeğinden bir tesis sipariş etmesinin programatik bir yoludur. Sistem çağrıları, işletim sisteminin kaynaklarını bir API (Uygulama Programlama Arayüzü) aracılığıyla kullanıcı programlarına sunar. Sistem çağrıları yalnızca çekirdek çerçevesine erişebilir. Kaynak gerektiren tüm servisler için sistem çağrılarına ihtiyaç vardır.

Linux çekirdeği, cihaza en düşük potansiyel aşamada yüklenen ve çalışan tescilli bir yazılımdır. Görevi, klavye, disk sürücüsü ve ağ olaylarından farklı programların eşzamanlı yürütülmesi için zaman dilimleri sağlamaya kadar makinede olan her şeyi organize etmektir. Yazılım ve donanımın ayrılması, koruma ve güvenilirliği artıran güvenli bir balon oluşturur. Ayrıcalıksız uygulamalar diğer programın deposuna erişemez ve biri başarısız olursa, çekirdek tüm sisteme zarar vermemesi için işlemi askıya alır.







Gofret İnce Sarıcı:

Linux sistem çağrıları, belirli programlarda çekirdeğe açıkça aktarılmaz. Hemen hemen tüm programlar temel C kitaplığını kullanır ve Linux sistem çağrıları üzerinde hafif ama gerekli bir sarmalayıcı sunar. Depo daha sonra özellik parametrelerinin doğru işlemci kayıtlarına çevrilmesini sağladıktan sonra eşlik eden Linux makine çağrısını sağlar. Sarıcı sistem çağrısından veri aldığında, onu analiz eder ve programa net bir şekilde katkıda bulunur. Bir programdaki herhangi bir makine etkileşimli işlem, nihayetinde bir sistem çağrısına dönüştürülür. Öyleyse, bazılarına bir göz atalım. Linux sistemimizde kullanabileceğimiz uzun bir Linux sistem çağrıları listesi var. İşte bazı yaygın ve en çok kullanılan Linux sistem çağrılarının listesi.



  • Açık
  • Kapat
  • Yürütme
  • Yazı yazmak
  • Okumak
  • Lseek
  • Seçme

Uygulamalı olmak için makalemizde C dilini kullanan bazı Linux sistem çağrılarını tartışalım.



Sistem Çağrısını Açın:

C dili kodumuzda belirteceğimiz belgeyi hızlı bir şekilde açmak için Linux dağıtımımızdaki Open system çağrısını kullanabiliriz. Öncelikle komut terminalini çalıştırın. Ctrl+Alt+T kısayolunu kullanabilirsiniz. Giriş dizininde bir test.txt metin dosyanız olduğunu ve içinde bazı içerikler bulunduğunu varsayalım. Bu nedenle, başlangıçta, nano düzenleyici aracılığıyla terminalde yeni bir C tipi dosya adı new.c oluşturmanız gerekir. Bu nedenle, aşağıdaki basit nano talimatı deneyin.





$nanoyeni.c

Şimdi, Nano editörü başlatıldı. Aşağıda gösterilen kodu içine yazın. Kodda iki dosya tanımlayıcımız var. Her iki dosya da açık sistem çağrısı kullanılarak açılabilir. İlk tanımlayıcı bir okuma çağrısı içerir ve ikincisi yazma işlevini içerir. İlk açık çağrı, test.txt metin dosyasını açmak ve içeriğini fd dosya tanımlayıcısına kaydetmektir. İkinci açık sistem çağrısı, hedef adlı bir dosya oluşturuyor. Belge hedefi bir fd1 dosya tanımlayıcısına geri ödendi. Yazma komutu, arabellekteki veri baytlarını kopyalamak için kullanılır. Kodu kaydetmek için Ctrl+S'ye dokunun ve dosyadan çıkmak için Ctrl+X kısayol tuşuna basın.



Bu C kodunu derlemek için gcc derleme talimatını çalıştırın.

$gccyeni.c

Kabuktaki basit a.out sorgusunu kullanarak kodu aşağıdaki gibi çalıştıralım:

$./a.out

Çıktı verileri dosya hedefine iletildi. Kedi sorgusunu kullanarak hedef dosyayı kontrol edelim. Çıktı ekranı, hedef dosyadaki 20 karakterlik verileri gösteriyor.

$kedihedef

Exec Sistem Çağrısı:

Yürütme sistem çağrısı, şu anda işlenmekte olan bir dosyayı çalıştırmak için yayınlanıyor. Eski yürütülebilir dosya değiştirilir ve geçerli dosya, exec çağrıldığında çalıştırılır. Bir exec sistem çağrısı kullanarak, bunu yapmanın döngüdeki eski belgenin veya uygulamanın üzerine yenisini yazacağını varsayabiliriz. Tüm sürecin malzemesini geçersiz kılmak için yeni yazılım kullanılır. exec() çağrıldığında deyimde başlığı verilen belge, exec() sistem çağrısını (()) çalıştıran kullanıcı bilgileri bölümünün yerine geçer. Komut terminalini açın ve nano düzenleyiciyi kullanarak aşağıdaki gibi yeni bir C tipi dosya oluşturun:

$nanoexp.c

Editör şimdi açıldı. Aşağıdaki C dili kodunun tamamını içine yazın. İçerisinde üç ana kütüphane bulunmaktadır. Bundan sonra, ana işlev somutlaştırıldı. Print deyimi, exp.c dosyasının dize verilerini ve İşlem Kimliğini gösteriyordu. Bunun için getpid() fonksiyonu kullanılmıştır. Ardından, içinde bazı değerler bulunan bir karakter tipi dizimiz var. Exec sistem çağrısı, dosya adını ve bir satır yukarıdaki diziyi argüman olarak almak için kullanılmıştır. Şimdi merhaba.c dosyası işlenecek. Bundan sonra, şu ana kadar başka bir print ifadesi gelir, ancak asla yürütülmez. Bu dosyayı kaydetmek için Ctrl+S tuşlarına basın. Çıkmak için Ctrl+X tuşlarına basın.

Şimdi nano düzenleyiciyi kullanarak başka bir c dosyası, merhaba.c oluşturma zamanı. Bunu yapmak için kabukta aşağıdaki sorguyu kullanın.

$nanoMerhaba C

İçine aşağıdaki kodu yazın. Bu kod, ana işlevde iki yazdırma ifadesi içerir. İlki yalnızca içinde verilen bir dizgiyi yazdırıyor ve ikincisi, o anda kullanılan dosyanın işlem kimliğini, yani merhaba.c'yi getirirken dizeyi yazdırıyor.

Her iki dosyayı da gcc kullanarak birbiri ardına derleyelim.

$gcc–o exp exp.c

$gcc–O merhaba merhaba.c

exp.c dosyasını çalıştırdığımızda, exp.c dosyasından ilk print deyimini ve merhaba.c dosyasından her iki print satırını da çıkaracaktır.

$./tecrübe

Çözüm:

Linux sistem çağrılarının tüm konseptini ve bunların Linux sisteminizde nasıl kullanılabileceğini ayrıntılı olarak ele aldık. Bu konsepti uygularken Ubuntu 20.04'ü kullandık.