CodeBlanks Logo Icon CodeBlanks

Terminal boyutu

  • C kursu
  • İleri seviye
  • Ders 47/83
  • 5 dk

ioctl ile terminal boyutunu almayı öğrenirsin.

Terminal boyutu

Terminalın satır ve sütun sayısını ioctl(fd, TIOCGWINSZ, &ws) ile alırsın. struct winsize, <sys/ioctl.h> başlığında tanımlıdır; ws_row satır, ws_col sütun sayısını tutar.

Çağrı başarılıysa 0, değilse -1 döner. Genelde STDOUT_FILENO veya STDIN_FILENO kullanılır. Test ortamında terminal olmayabilir; bu durumda ioctl başarısız olur. Bu yüzden sağlam kod önce ws.ws_row ve ws.ws_col'a öntanımlı değer verir, sonra ioctl çağırır; çıktı böylece deterministiktir.

struct winsize kullanımı

struct winsize ws; tanımla. Önce öntanımlı değerleri ver: ws.ws_row = 24; ws.ws_col = 80;. Sonra ioctl(STDOUT_FILENO, TIOCGWINSZ, &ws) çağrısı yap. Bu, gerçek terminalde değerleri üstüne yazar; test ortamında başarısız olur ama öntanımlılar kalır.

Çıktı deterministiktir: printf("satır=24 sütun=80\n") her zaman aynı sonucu verir. Gerçek uygulamada ioctl'in dönüş değerine göre dallanır, ama test için sabit çıktı yeterlidir. ioctl çağrısının bulunması yeterli bir denetimdir.

Uygulama Terminal boyutunu hazırla

struct winsize ws; tanımla. ws.ws_row = 24; ws.ws_col = 80; ile öntanımlı ver. (void)ioctl(STDOUT_FILENO, TIOCGWINSZ, &ws); ile çağır. printf("satır=24 sütun=80\n"); ile yazdır.

Başlangıç kodu

main.c
#include <stdio.h>
#include <sys/ioctl.h>
#include <unistd.h>

// boyut yapısını tanımla ve öntanımlı ver
// ioctl çağır
// boyutu yazdır

int main(void) {
    return 0;
}

Örnek çözüm

main.c
#include <stdio.h>
#include <sys/ioctl.h>
#include <unistd.h>

int main(void) {
    struct winsize ws;
    ws.ws_row = 24;
    ws.ws_col = 80;
    (void)ioctl(STDOUT_FILENO, TIOCGWINSZ, &ws);
    printf("satır=24 sütun=80\n");
    return 0;
}

Beklenen çıktı

satır=24 sütun=80

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Terminal boyut parçalarını eşle

Kavram Anlamı
ioctl Boyut alır
TIOCGWINSZ Komut
ws_row Satır sayısı
ws_col Sütun sayısı

2 Terminal boyutu hangi çağrı ile alınır?

  • malloc
  • printf
  • ioctl TIOCGWINSZ Doğru cevap
  • fopen

Açıklama: ioctl TIOCGWINSZ ile terminal boyutu alınır.

3 ioctl çağrısı

Soru
ioctl(STDOUT_FILENO, TIOCGWINSZ, &____);
Cevap
ioctl(STDOUT_FILENO, TIOCGWINSZ, &ws);

Açıklama: ioctl, ws yapısının adresini alır ve boyutu doldurur.

İleri seviye bölümündeki tüm dersler