Syscall
- C kursu
- Uzman
- Ders 2/47
- 5 dk
Sistem çağrıları (syscall) kavramını öğrenirsin.
Sistem çağrısı (syscall)
Sistem çağrısı (syscall), kullanıcı programının çekirdekten hizmet istemesidir. Her syscall bir numarayla tanımlanır: read, write, open, close yaygın örneklerdir.
C'de <unistd.h> bu sarmalları bildirir. Çağrı yapılınca CPU trap yapar; çekirdek ilgili hızmeti yürütür ve dönüş değerini kullanıcıya verir. Hata durumunda dönüş -1 olur ve errno ayarlanır. Çekirdek syscall tablosu her komut numarasını bir işleve bağlar; bu tablo mimariye göre değişir.
Syscall numaraları ve errno
Her syscall'ın bir numarası vardır. Linux x86-64'te SYS_read = 0, SYS_write = 1, SYS_open = 2 biçimindedir. <sys/syscall.h> bu sabitleri tanımlar.
Sarmal fonksiyonlar (read, write) bu numaraları dolaylı kullanır. Doğrudan syscall(SYS_read, ...) biçiminde de çağrılabilir; ancak taşınabilirlik için sarmal tercih edilir. Hata durumunda errno durumu açıklar; strerror ile metne çevrilir. Çekirdek bu numaraları sabit tutar; ABI uyumu için değişmez.
Uygulama Syscall adlarını yazdır
void print_syscall(const char *name) fonksiyonunu tanımla; gövdesi printf("syscall: %s\n", name); olsun. main içinde bu fonksiyonu "read", "write", "open" ile çağır.
Başlangıç kodu
#include <stdio.h>
// print_syscall fonksiyonunu tanımla
// read, write, open için çağır
int main(void) {
return 0;
}Örnek çözüm
#include <stdio.h>
void print_syscall(const char *name) {
printf("syscall: %s\n", name);
}
int main(void) {
print_syscall("read");
print_syscall("write");
print_syscall("open");
return 0;
}Beklenen çıktı
syscall: read syscall: write syscall: open
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Syscall sarmallarını amacına eşle
| Kavram | Anlamı |
|---|---|
read |
Veri okur |
write |
Veri yazar |
open |
Dosya açar |
close |
Tanıtıcı kapatır |
2 Aşağıdakilerden hangisi bir sistem çağrısıdır?
- printf
- read Doğru cevap
- malloc
- fopen
Açıklama: read doğrudan bir sistem çağrısıdır; printf ve fopen libc sarmallarıdır.
3 syscall çağrısını tamamla
long ret = syscall(____, 1, buf, n);
long ret = syscall(SYS_write, 1, buf, n);
Açıklama: SYS_write numarası yazma sistem çağrısını seçer.