CodeBlanks Logo Icon CodeBlanks

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.

Başlangıç kodu

main.c
#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

main.c
#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

Soru
.read = my_____,
Cevap
.read = my_read,

Açıklama: .read alanı my_read fonksiyonuna bağlanır.

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