2011-05-14 25 views
8

Örnek Linux çekirdeğim modülünün birinde, tüm işlevlerin dışında Device_Open statik olarak bildirilmiş bir değişkenim var ve numaralı bir işlev içinde bildirilen bir statik değişken counter var. device_open içinde, hem Device_Open hem de counter değerini artırıyorum. Modül, herhangi bir hata olmadan çekirdeğe eklenir ve modülüm/dev/chardev için bir cihaz dosyası oluşturdum.Statik global değişken ve sürücü işlevinde statik yerel değişken

cat /dev/chardev yapıyorum. Görebildiğim, 'un her bir cat /dev/chardev çağrısı için artırılmasıdır, ancak Device_Open her zaman 0'dır. Değişkenlerin değerini artırma ile ilgili davranış farklılıklarının nedeni nedir?

Aşağıda ben "Device_Open" araması ve karşılık gelen cihaz salınımını bulundu anlayış

static int Device_Open = 0; 

static int device_open(struct inode *inode, struct file *file) 
{ 
    static int counter = 0; 

    printk(KERN_INFO "Device_Open = %d", Device_Open); 
    printk(KERN_INFO "counter = %d", counter); 

    if (Device_Open) 
     return -EBUSY; 

    Device_Open++; 
     counter++; 

    try_module_get(THIS_MODULE); 

    return SUCCESS; 
} 
+1

Aygıtı kapatırken Device_Open öğesini azaltmadığınızdan emin misiniz (device_close() öğesini çağırırken)? – Antti

+0

@Thanks Antti ... Eksik bağlantı var. –

+0

Lütfen soru sormadan önce kendi kodunuzu okuyarak daha fazla zaman geçirin. Posterin zihnini okumak için – moorray

cevap

7

için kod parçası olduğunu. Bu işleve sahip olmadığına emin misin? TLDP numaralı telefondan buldum.

static int device_release(struct inode *inode, struct file *file) 
{ 
#ifdef DEBUG 
    printk(KERN_INFO "device_release(%p,%p)\n", inode, file); 
#endif 

    /* 
    * We're now ready for our next caller 
    */ 
    Device_Open--; 

    module_put(THIS_MODULE); 
    return SUCCESS; 
} 
+5

+1. –

+0

Kusursuz ... 'cat/dev/chardev' çalıştırıldıktan sonra/dev/chardev aygıt dosyasının kapatıldığını ve çekirdek 'Device_Open' değerinin azalması için' device_release' komutunu çağırdığı gerçeğini kaçırdım. Bana eksik bağlantıyı hatırladığın için teşekkürler. –

İlgili konular