Sistem Çağrıları
Önceki XXV. Oylum - Temel Yazılım ve Sistem Arayüzü Sonraki
Sistem Çağrıları
Bir sistem çağrısı bir yazılımın çekirdekten bir hizmet isteği yapması için kullanılır. Hizmet genellikle, G/Ç işlemleri gibi sadece çekirdeğin ayrıcalığında olan şeylerdir. Yazılım geliştirenlerin genellikle bu sistem çağrılarını bilmeye ihtiyacı olmaz. Çünkü GNU C kütüphanesi sistem çağrılarının yaptığı hemen herşeyi sanal olarak sağlayan işlevler içerir. Örneğin, bir dosyanın erişim izinlerini değiştiren bir sistem çağrısı vardır, ama GNU C kütüphanesinin chmod işlevi zaten bu işlemi yaptığından bu sistem çağrısını kullanma ihtiyacı ortaya çıkmaz.
Sistem çağrılarına kimi zaman çekirdek çağrıları dendiği de olur.
Her ne kadar doğrudan sistem çağrıları yapma ihtiyacı duyulmasa da GNU C kütüphanesi bunu yapabilmeniz için syscall işlevini içerir. syscall kullanımı zordur ve chmod gibi işlevleri kullanmak daha taşınabilirdir, ama sistem çağrılarını makine kodu komutları ile kodlamaktan daha kolay ve daha taşınabilirdir.
syscall çağrıları, henüz GNU C kütüphanesinde bulunmayan özel sistem çağrıları ile çalışacağınız zaman oldukça kulllanışlı olacaktır. syscall tamamen soysal bir yöntemle gerçeklenmiştir; işlev belli bir sistem çağrısının ne yaptığıyla, hatta geçerli olup olmadığıyla bile ilgilenmez.
Bu kısımdaki syscall işlevi ile ilgili açıklama, GNU C kütüphanesinin çalıştığı çeşitli platformlardaki sistem çağrıları için belli bir protokolün varlığı kabulüne dayanır. Bu protokol herhangi bir otorite tarafından tanımlanmamıştır, ancak onu burada açıklamayacağız.
syscall işlevi unistd.h başlık dosyasında bildirilmiştir.
long int syscall
(long int sysno, ...)
işlev
syscall temel bir sistem çağrısını uygular.
sysno, sistem çağrı numarasıdır. Sistem çağrılarının her biri bir numara ile yapılır. Olası tüm sistem çağrılarının numaralarını içeren makrolar sys/syscall.h başlık dosyasında tanımlanmıştır.
Kalan argümanlar o sistem çağrısına özel argümanlardır. Her çeşit sistem çağrısı kendine özgü sayıda, birden beşe kadar argümana sahiptir. Eğer kodunuz sistem çağrısının aldığından daha fazla argüman içeriyorsa bunlar basitçe yoksayılacaktır.
İşlevin dönüş değeri sistem çağrısı başarısız olmadıkça, sistem çağrısının dönüş değeri olacaktır. Sistem çağrısı başarısız olursa işlev -1 ile döner ve errno değişkenine sistem çağrısından dönen hata kodu atanır. Sistem çağrıları başarılı olduklarında -1 döndürmezler.
Geçersiz bir sysno belirtirseniz, syscall işlevi -1 ile döner ve errno = ENOSYS olur.
Örnek:
#include <unistd.h>
#include <sys/syscall.h>
#include <errno.h>

...

int rc;

rc = syscall(SYS_chmod, "/etc/passwd", 0444);

if (rc == -1)
   fprintf(stderr, "chmod, errno = %d ile başarısız oldu\n", errno);
Uyumluluk bakımından yıldızları barışmışsa, bu kod şu koda eşdeğerdir:
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>

...

int rc;

rc = chmod("/etc/passwd", 0444);
if (rc == -1)
   fprintf(stderr, "chmod, errno = %d ile başarısız oldu\n", errno);
Önceki Üst Ana Başlık Sonraki
Standart Ortam Değişkenleri Başlangıç Yazılımın Sonlandırılması
Bir Linux Kitaplığı Sayfası