2012-12-07 152 views
0
static ssize_t my_read(struct file *f, char __user *buf, size_t 
     len, loff_t *off) 
{ 
    static int first=1; 
    printk(KERN_INFO "Driver: read()\n"); 
    printk(KERN_INFO "Value of loff_t %ld",*off); 
    printk(KERN_INFO "Inside value of stringlength is %d",strlen(buffer)); 


    if (copy_to_user(buf,buffer, 1) != 0) 
     return -EFAULT; 
    else 
    { 
     if(first<=strlen(buffer)) 
     { 
      first=first+1; 
      printk(KERN_INFO "INside value of first is %d",first); 
      printk(KERN_INFO "Inside value of stringlength is %d",strlen(buffer)); 

      return 1; 
     } 
     else 
       return 0; 
    } 


    } 
     static ssize_t my_write(struct file *f, const char __user *buf, 
     size_t len, loff_t *off) 
    { 
     printk(KERN_INFO "Driver: write()\n"); 
     if (copy_from_user(buffer, buf+len-1, 1) != 0) 
      return -EFAULT; 
     else 
      return len; 

    } 

但是第一次我也呼應-n「你好」和cat /dev/mynull,只會打印o和釋放裝置對於一些reason.Subsequent cat /dev/mynull回報什麼。 strlen(buffer)的值爲1.
這是怎麼回事?預期的結果是,你好應該打印和strlen()應該返回5爲什麼我的設備驅動程序不打印什麼,我輸入

+0

你應該真的改善你的代碼格式。這很難閱讀。我的編輯重點是重新編輯。 – rekire

+0

您是否看到其他印刷品,這只是錯誤的長度?還有,這裏有多少塊代碼?它應該只是一個,因爲你的大括號不排隊...... – Mike

+0

我想現在塊的排隊。按照@rodrigo的建議將值更改爲len後,我得到了五次打印,而不是打印出來的你好。 – user1667307

回答

2

這條線在my_write:從buf+len-1用戶地址到內核緩衝區

copy_from_user(buffer, buf+len-1, 1) 

拷貝1個炭。這是用戶字符串的最後一個字符,即'o'。我覺得應該是:

copy_from_user(buffer, buf, len); 

然後:

buffer[len] = 0; 

以防萬一用戶緩衝區不會NUL終止。

所有這些都沒有考慮到off的值,但這取決於你想要做什麼(可能複製到buffer + *off?)。 順便說一下,你還應該檢查緩衝區溢出等。

+0

我完全錯過了。但即使在將其更改爲len並更改copy_to_user(buf,buffer,strlen(buffer))之後,它將打印五次而不是打印出的Hello。 – user1667307

+0

好的,終於有了它的工作。如果是第一次,我必須重試5次,否則我必須返回strlen(緩衝區)。感謝您的幫助 – user1667307

+0

不客氣!順便說一句,直接訪問用戶緩衝區是被禁止的,這就是爲什麼首先有一個'copy_from_user'函數,而不是'memcpy'。所以你不能這樣使用'strlen'。即使沒有考慮到用戶數據可能沒有結束NUL。 – rodrigo

相關問題