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
#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
#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ı
ioctl(STDOUT_FILENO, TIOCGWINSZ, &____);
ioctl(STDOUT_FILENO, TIOCGWINSZ, &ws);
Açıklama: ioctl, ws yapısının adresini alır ve boyutu doldurur.