fops
- C kursu
- Uzman
- Ders 11/47
- 5 dk
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.
Başlangıç kodu
#include <stdio.h>
// fops_entry yapısını tanımla
// dört alanlık dizi oluştur ve for ile yazdır
int main(void) {
return 0;
}Örnek çözüm
#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;
}Beklenen çıktı
.open -> device open .read -> user reads .write -> user writes .release -> device close
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 fops alanlarını çağrı anına eşle
| Kavram | Anlamı |
|---|---|
.open |
Cihaz açılınca |
.read |
Kullanıcı okuyunca |
.write |
Kullanıcı yazınca |
.release |
Cihaz kapanınca |
2 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 Doğru cevap
- Modül kaldırılınca
Açıklama: .read, kullanıcı read() çağrınca tetiklenir.
3 fops .read atamasını tamamla
.read = my_____,
.read = my_read,
Açıklama: .read alanı my_read fonksiyonuna bağlanır.