C
fops
file_operations yapısını öğrenirsin.
file_operations yapısı
Bir karakter sürücüsü, file_operations yapısıyla kullanıcı alanına hangi işlemleri desteklediğini bildirir. Bu yapıya genellikle fops denir.
Her alan bir fonksiyon işaretçisidir: .open, .read, .write, .release. Kullanıcı read() yapınca çekirdek sürücünün .read işaretçisini çağırır. Desteklenmeyen işlem NULL bırakılır; çekirdek bunu uygun hataya çevirir. fops, cdev_init ve cdev_add ile kaydedilir. Bu sayede kullanıcı alanı /dev altındaki dosyayı sıradan dosya gibi kullanır.
fops tanımlama
fops yapısı genellikle statik bir const değişken olarak tanımlanır. Alanlar .isim = fonksiyon biçiminde atanır; sıra önemli değildir.
Örnek: static const struct file_operations my_fops = { .open = my_open, .read = my_read, .write = my_write, .release = my_release };. Bu yapı cdev_init'e ikinci parametre olarak verilir. Sürücü yazarı her fonksiyonun imzasını çekirdek prototipine uygun yazmak zorundadır. Yanlış imza derleme hatası değil, çalışma zamanı hatası verir.
Uygulama fops alanlarını yazdır
struct fops_entry { const char *name; const char *when; } tanımla. main içinde dört elemanlı bir dizi oluştur: {".open", "device open"}, {".read", "user reads"}, {".write", "user writes"}, {".release", "device close"}. Bir for döngüsüyle her elemanı printf("%s -> %s\n", ...) ile yazdır.
Örnek çözümü göster
#include <stdio.h>
struct fops_entry { const char *name; const char *when; };
int main(void) {
struct fops_entry fops[] = {
{".open", "device open"},
{".read", "user reads"},
{".write", "user writes"},
{".release", "device close"}
};
int n = sizeof(fops) / sizeof(fops[0]);
for (int i = 0; i < n; i++) {
printf("%s -> %s\n", fops[i].name, fops[i].when);
}
return 0;
}
Kendini test et
-
fops alanlarını çağrı anına eşle
- .open
- Cihaz açılınca
- .read
- Kullanıcı okuyunca
- .write
- Kullanıcı yazınca
- .release
- Cihaz kapanınca
-
file_operations yapısının .read alanı ne zaman çağrılır?
- Cihaz açılınca
- Modül yüklenince
- Kullanıcı okuma yapınca
- Modül kaldırılınca
Cevabı göster
Kullanıcı okuma yapınca — .read, kullanıcı read() çağrınca tetiklenir.
-
fops .read atamasını tamamla
.read = my_____,
Cevabı göster
.read = my_read,
Sıradaki ders: Özet - Sürücü temelleri