ioctl
- C kursu
- Uzman
- Ders 3/47
- 5 dk
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
#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
#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
int ret = ioctl(fd, ____, &win);
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.