CodeBlanks Logo Icon CodeBlanks

ioctl

ioctl ile cihaz kontrolünü öğrenirsin.

ioctl nedir?

ioctl (input/output control), cihaz sürücülerine özel komutlar gönderen sistem çağrısıdır. read ve write veri aktarırken; ioctl davranışı değiştirir.

Örneğin terminal pencere boyutunu TIOCGWINSZ komutuyla okursun. Disk hızını ayarlamak, ağ arabirimini yapılandırmak da ioctl ile yapılır. Komutlar <sys/ioctl.h> başlığında tanımlanır. Her komut bir numara, yön ve veri boyutu kodlar; _IOR, _IOW, _IOWR makroları bunları üretir.

Komut makroları ve yön

ioctl komutları _IOR(magic, nr, type) biçiminde üretilir. magic cihaz ailesini, nr komut numarasını, type veri yapısını belirtir.

Yön kodu verinin akışını söyler: _IOR çekirdekten kullanıcıya okuma, _IOW kullanıcıdan çekirdeğe yazma, _IOWR iki yönlüdür. Yanlış komut göndermek ENOTTY hatası verir. Sürücü yazarı bu makrolarla kendi komut setini tanımlar; böylece komut numaraları çakışmaz. C programcısı yalnızca önceden tanımlı sabitleri kullanır.

Uygulama ioctl komutlarını yazdır

struct ioctl_cmd { const char *name; int code; } tanımla. main içinde üç elemanlı bir dizi oluştur: {"IOCTL_GET", 0}, {"IOCTL_SET", 1}, {"IOCTL_RUN", 2}. Bir for döngüsüyle her elemanı printf("%s=%d\n", ...) ile yazdır.

Başlangıç kodu

main.c
#include <stdio.h>

// ioctl_cmd yapısını tanımla
// üç komutluk dizi oluştur ve for ile yazdır

int main(void) {
    return 0;
}

Örnek çözüm

main.c
#include <stdio.h>

struct ioctl_cmd { const char *name; int code; };

int main(void) {
    struct ioctl_cmd cmds[] = {
        {"IOCTL_GET", 0},
        {"IOCTL_SET", 1},
        {"IOCTL_RUN", 2}
    };
    int n = sizeof(cmds) / sizeof(cmds[0]);
    for (int i = 0; i < n; i++) {
        printf("%s=%d\n", cmds[i].name, cmds[i].code);
    }
    return 0;
}

Beklenen çıktı

IOCTL_GET=0
IOCTL_SET=1
IOCTL_RUN=2

Soru ve cevaplar

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

1 ioctl komutunu tamamla

Soru
int ret = ioctl(fd, ____, &win);
Cevap
int ret = ioctl(fd, TIOCGWINSZ, &win);

Açıklama: TIOCGWINSZ terminal pencere boyutunu okur.

2 ioctl makrolarını eşle

Kavram Anlamı
_IOR Çekirdeği okuma
_IOW Çekirdeğe yazma
_IOWR İki yönlü
_IO Veri yok

3 ioctl ne için kullanılır?

  • Ağ paketi göndermek
  • Dosya okumak
  • Cihaza komut göndermek Doğru cevap
  • Bellek ayırmak

Açıklama: ioctl cihaza özel komutları iletir.

Uzman bölümündeki tüm dersler