C ile Linux sistem programlama
Sistem çağrılarıyla dosya, süreç, sinyal, boru ve paylaşılan bellek işlerini doğrudan yapar, düzgün kapanan ve yetkisini düşüren servisler yazarsın.
Seviye 301 · 23 ders · 24 pratik lab
Dersler
Sistem çağrıları ve dosyalar
- Sistem çağrısı nedir: libc ile çekirdek arasında
- Düşük düzey G/Ç: open, read, write, close
- Dosya tanımlayıcıları ve dup2 ile yönlendirme
- stat, izinler ve umask
- Dosya kilitleme: flock ve fcntl
- Kısa görev: yalnızca sistem çağrılarıyla cat
Süreçler
- fork: süreci ikiye bölmek
- exec ailesi ve ortam değişkenleri
- wait, waitpid ve zombi süreçler
- Borular: pipe ile süreçler arası veri
- Kısa görev: iki komutu boruyla bağlayan program
Sinyaller ve zaman
- Sinyaller ve sigaction
- Sinyal işleyicide güvenli işlevler
- Zamanlayıcılar: alarm, nanosleep ve timerfd
- Arka plan servisi yazmak ve systemd ile çalıştırmak
- Kısa görev: SIGTERM ile düzgün kapanan servis
Bellek ve haberleşme
- mmap ile dosyayı belleğe eşlemek
- Paylaşılan bellek ve POSIX semaforları
- UNIX alan soketleri
- Kullanıcı kimlikleri, setuid ve yetki düşürme
- inotify ile dosya değişikliklerini izlemek
- Kısa görev: değişen dosyaları günlükleyen izleyici
Bitirme
- Bitirme görevi: çöken işi yeniden başlatan süreç denetçisi
Pratik lablar
- Kısmi write çağrılarını tamamlamak: write'ın kısmi yazmalarını döngüyle tamamlayan write_all fonksiyonunu yaz ve EINTR durumunu da ele al.
- Dosyanın son baytlarını lseek ile okumak: Yalnızca open, lseek ve read kullanarak bir dosyanın son N baytını yazdıran programı yaz.
- Standart hatayı günlük dosyasına yönlendirmek: Bir programın stderr çıktısını dup2 ile günlük dosyasına yönlendir ve dosya tanıtıcılarının sızmadığını /proc ile doğrula.
- Aynı anda tek kopya çalıştırmak: Bir yedekleme işinin iki kopyası aynı anda başlarsa ikincisini flock ile reddeden kilit mantığını yaz.
- Herkesin yazabildiği dosyaları raporlamak: stat ile bir klasördeki dosyaların izinlerini oku ve herkesin yazabildiği dosyaları listele.
- Gizli dosyayı doğru izinle oluşturmak: Anahtar dosyasını oluşturan kodu umask'tan bağımsız olarak 0600 izinle ve O_EXCL ile oluşturacak şekilde düzelt.
- Kayıt düzeyinde fcntl kilidi: Ortak bir sayaç dosyasında yalnızca ilgili kaydı fcntl ile kilitleyip iki sürecin güncellemelerini kaybetmeden yaz.
- Çocuk süreçlerin çıkış kodlarını toplamak: Üç çocuk süreç başlatıp her birinin çıkış kodunu waitpid ve WEXITSTATUS ile raporlayan programı yaz.
- Temiz ortamla program çalıştırmak: execve ile bir yardımcı programı yalnızca izin verilen ortam değişkenleriyle çalıştır ve PATH'i sabitle.
- Zombi süreçleri temizlemek: Zombi biriktiren bir iş başlatıcısına SIGCHLD işleyicisi ve waitpid döngüsü ekle; ps çıktısında zombi kalmasın.
- Üç aşamalı boru hattı kurmak: Üç komutu iki boruyla birbirine bağlayan programı yaz; kullanılmayan uçları kapat ki program asılı kalmasın.
- SIGHUP ile ayarları yeniden yüklemek: sigaction ile SIGHUP gelince bir bayrak kuran ve ana döngüde ayarları yeniden okuyan servisi tamamla.
- Sinyal işleyicisini güvenli hale getirmek: İçinde printf ve malloc çağıran sinyal işleyicisini yalnızca güvenli fonksiyonlar ve volatile sig_atomic_t kullanacak şekilde yeniden yaz.
- timerfd ile kalp atışı göndermek: Her iki saniyede bir kalp atışı yazan ve aynı döngüde stdin'i dinleyen programı timerfd ve poll ile yaz.
- Büyük dosyada satırları mmap ile saymak: Bir dosyayı mmap ile belleğe eşleyip satır sayısını bul; boş dosyada doğru davran.
- Paylaşılan bellekte sayaç korumak: İki sürecin paylaşılan bellekteki sayacı artırdığı programa POSIX semaforu ekle; sonuç her çalıştırmada doğru olsun.
- UNIX soketinde istemci kimliğini doğrulamak: Bir UNIX alan soketi sunucusunda SO_PEERCRED ile bağlanan kullanıcının UID'sini kontrol edip yetkisizleri reddet.
- Ayrıcalıkları doğru sırayla bırakmak: setuid'i setgid'den önce çağıran ayrıcalık bırakma kodunu düzelt, ek grupları da temizle ve bırakılan ayrıcalıkların geri alınamadığını test et.
- Ayar dosyasındaki değişikliği izlemek: inotify ile tek bir ayar dosyasını izleyip değiştiğinde zaman damgalı bir satır yazan programı yaz.
- Yeni alt klasörleri de izlemek: Bir klasör ağacını izleyen programa sonradan oluşturulan alt klasörleri otomatik izlemeye alma özelliği ekle.
- Sinyal yağarken dosya kopyalamak: Sürekli sinyal alan bir süreçte read ve write çağrılarını EINTR ve kısmi sonuçlara dayanıklı yap ve kopyanın özetinin kaynakla aynı olduğunu kanıtla.
- Çocuk sürece sızan tanımlayıcıları kapatmak: exec ile başlatılan çocuk süreçte açık kalan gizli dosya ve soket tanımlayıcılarını /proc üzerinden bul; O_CLOEXEC ile kapat ve yalnızca gereken üç tanımlayıcının kaldığını doğrula.
- Paylaşımlı ve özel dosya kilidi almak: Okuyucu programa paylaşımlı, yazıcı programa özel flock kilidi ekle; iki okuyucunun birlikte çalıştığını, yazıcının ise beklediğini gözlemle.
- Yeniden adlandırmayla kaydedilen dosyayı izlemek: Düzenleyiciler dosyayı geçici ad üzerinden yeniden adlandırarak kaydedince izlemeyi kaybeden programı, dizini izleyip doğru olayları süzecek şekilde düzelt.
Kurs hakkında
Sistem çağrılarıyla dosya, süreç, sinyal, boru ve paylaşılan bellek işlerini doğrudan yapar, düzgün kapanan ve yetkisini düşüren servisler yazarsın.
Ne öğreneceksin
- Sistem çağrıları ve dosyalar
- Süreçler
- Sinyaller ve zaman
- Bellek ve haberleşme
- Bitirme
Ön koşullar
Aynı yolun 101 ve 201 düzeyindeki konularına hâkim olmalısın.
Lab ortamı
Dersler, tarayıcında açılan sana özel bir Kali Linux terminalinde geçer. Kurulum gerekmez; lab her derste temiz başlar.
Sık sorulan sorular
- Bu kurs benim düzeyime uygun mu?
- Kurs 301 düzeyindedir; daha düşük düzeydeki kursların konularını bildiğin varsayılır.
- Kurulum gerekir mi?
- Hayır. Her ders tarayıcında açılan sana özel bir lab ortamında geçer.
- Dersler nasıl işleniyor?
- Her ders 8 ile 10 adımdan ve bir kısa sınavdan oluşur. İlk adımlarda yazman gereken komut gösterilir, sonraki adımlarda yardım azalır; iki denemede takılırsan çözüm açılır.
- Ücretsiz deneyebilir miyim?
- Evet. Her kursun ilk üç dersi ücretsizdir.