2012-10-19 24 views
7

Tôi đang viết trình điều khiển thiết bị cho Linux. Nó tạo ra một thiết bị với 4 số nhỏ. Bất cứ khi nào chúng tôi cố gắng ghi vào thiết bị ở số nhỏ 3, chúng tôi giả sử để giết thiết bị và hiện tại nó không phải là giả sử để làm bất cứ điều gì khác ngoại trừ in nó được ghi vào thiết bị booga. Dưới đây là một số mã hiện tại của tôi và tôi có thể gửi mã hơn nếu cần thiết:Trình điều khiển thiết bị Linux, Có thể lấy số nhỏ bằng cách sử dụng bộ mô tả tệp không?

phương thức Write:

static ssize_t booga_write (struct file *filp, const char *buf, size_t count, loff_t *f_pose) { 
    printk("Attempting to write to booga device\n"); 
    /* need to protect this with a semaphore if multiple processes 
     will invoke this driver to prevent a race condition */ 

    if (down_interruptible (&booga_device_stats->sem)) 
     return (-ERESTARTSYS); 
    booga_device_stats->num_bytes_written += count; 
    up(&booga_device_stats->sem); 
    return count; // pretend that count bytes were written 

} 

Làm thế nào nó được kiểm tra:

static void run_write_test(char *device, int bufsize) 
{ 
    char *buf; 
    int src; 
    int out; 

    src = open(device, O_WRONLY); 
    if (src < 0) { 
     perror("Open for write failed:"); 
     exit(1); 
    } 
    buf = (char *) malloc(sizeof(char)*(bufsize+1)); 
    fprintf(stderr, "Attempting to write to booga device\n"); 
    out = write(src, buf, bufsize); 
    fprintf(stderr, "Wrote %d bytes.\n", out); 
    free(buf); 
    close(src); 

} 

Tôi tự hỏi nếu có một cách để lấy số nhỏ. Tôi nhìn vào linux/fs.h và thấy rằng cấu trúc tập tin có một thành viên được gọi là private_data nhưng bất cứ khi nào tôi cố gắng gọi nó, nó sẽ sụp đổ hệ thống của tôi vì nó hiện đang được đặt thành null.

Hoặc tôi không nên cố gắng lấy số nhỏ từ tệp cấu trúc và nên cố gắng theo dõi nó khi lần đầu tiên mở thiết bị?

Trả lời

13

Bạn có thể nhận được số nhỏ như vậy:

iminor(filp->f_path.dentry->d_inode) 
Các vấn đề liên quan