2012-01-26 6 views
1

私はLinuxに慣れていて、ユーザーがデバイスファイルに読み書きできるモジュールを作っていました。書き込み機能ではありません。私のコードでデバイスファイルの読み書きに何が間違っていますか?

MODULE_LICENSE("DUAL BSD/GPL"); 

char message[80]; 
char *msg_ptr; 

int dev_major = 0; 
int dev_minor = 0; 

struct cdev *cdev; 

ssize_t dev_read(struct file *filp,char __user *buf,size_t count,loff_t *offset) 
{ 
int i; 
i=copy_to_user(buf,msg_ptr,count); 
printk(KERN_ALERT"buff:%s",buf); 


return 0; 
} 
    ssize_t dev_write(struct file *filp,const char __user *buf,size_t count,loff_t *offset) 
{ 
    int j; 
    msg_ptr = kmalloc(sizeof(*buf),GFP_KERNEL); 
    copy_from_user(msg_ptr,buf,sizeof(*buf)); 
//printk(KERN_ALERT"msg_ptr:%s",msg_ptr); 
    return 0; 
     } 

私はchar型のノードを作成して、エコーハイ>は/ dev/my_devを使用する場合、それはハイ出力しますが、/ var/log/messagesに見られるようにinfintely書き込みます。

答えて

0

dev_writeは、書き込まれたバイト数を返す必要があります。
0を返すと、Linuxは0バイトを書き込んだことを理解し、残りの部分を書き込むためにもう一度あなたを呼び出します。もう一度...

同義語dev_readと同じです。

1

この行は、間違って見えます:あなたが唯一の可能性の高いアーキテクチャに応じて4または8バイトであるsizeof(*buf)バイトを、コピー

copy_from_user(msg_ptr, buf, sizeof(*buf)); 

引数はcountです。

+0

ポインターではなく指し示すオブジェクトのサイズです。だから最悪の場合: 'sizeof(* buf)'は1です。 – ouah

+0

copy_from_user(msg_ptr、buf、count);私はそれを使用しましたが、問題はまだそこにあります..........これ以上の提案。 – karan421

関連する問題