2012-01-13 22 views
2

ファイルをシミュレートするためにlinuxのcharデバイスドライバを書きます。デバイスドライバとしてのLinux仮想ファイル

static ssize_t data_read(struct file *f, char __user *buf, size_t count, loff_t *f_pos){ 
char *msg_pointer; 
int bytes_read = 0; 

if(vault.storage==NULL) 
    return -EFAULT; 

msg_pointer = vault.storage + *f_pos; 

while (count && (*f_pos < vault.size)) { 
    put_user(*(msg_pointer++), buf++); 
    count--; 
    bytes_read++; 
    ++*f_pos; 
} 

return bytes_read; 
} 

vault.storageはkmallocの創造へのポインタである...データは、配列に格納されたと私は、「読み取りファイル」-handlerを実装したいです。私は、DDでコピーしてコードをテストする場合、期待どおりには動作しますが、私はC

if((fp_data = open("/dev/vault0", O_RDWR)) < 0){ 
    perror("could not open file.\n"); 
} 

err = write(fp_data, "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890", 36); 

if (err < 0){ 
    perror("failed to write to sv \n"); 
} 

read(fp_data, buffer, 36); 
read(fp_data, buffer, 36); 

最初のリード・コマンドが返す4でファイルを開きたいとき...二0 - どのようにこれは可能ですか?

+0

に属し、私はコードのみを脱脂、多分あなたは '書き込みの間で求めるべきである私はあなたのデバイスファイルのメジャー番号とマイナー番号を意味し、あなたのドライバが読み取りと書き込みの機能が適切に呼ばれていることを前提としてい'と'読んだ 'ものです。 – asveikau

+0

偉大な、これは理にかなっていますが、どうすれば探せますか?それはストリームではないので、私はfseekを使用することはできません... – NaN

+0

ところで、あなたはファイル記述子 'fp_svdata'を開きますが、あなたは' fp_data'から書き込んで読み込みます... 'fp_data'はタイプミスですか? – Jason

答えて

3

writeは、要求された書込み量がPIPE_BUFのサイズより小さい場合に、パイプまたはFIFO用に予約されているだけで、アトミックに要求されたすべてのバイトを書き込む保証はありません。例えば、writeは、いくつかのバイトを書き込んだ後で信号によって中断することができ、writeが返す前に要求されたバイトの全数を出力しない場合があります。したがって、書き込まれたバイト数をテストして、バッファに情報を読み戻して、書き込まれた同じバイト数を読み戻そうとしていることを確認する必要があります。

0

data_read呼び出しにprintkを置き、カウントを出力し、返されたものを出力します(bytes_readの値を確認してください)。 bytes_readは、使用領域のread()呼び出しに返されます。正しい値を戻していることを確認してください。また、fposを印刷して何が起きているかを確認することもできます。

ここで私はあなたのドライバ

関連する問題