2017-11-18 20 views
4

ユーザスペースから読み書きできるカーネルスペースデバイスドライバを作成しています。開いた、読まれた、解放の操作はすべて完全に機能します。私が抱えている問題は、デバイスドライバにアクセスして何かを書く必要があるユーザスペースコードです。Linuxデバイスドライバに書き込むと無限ループが発生する

ユーザスペースプログラムは、1).txtファイルに書き出します(コンソールにaを出力して完了したことをユーザーに知らせます)。2)デバイスドライバに出力します。ユーザーにも完了したことを知らせるテキスト)。以下は

フルにユーザ空間のコードです:

int main() { 
    FILE *fp; 

    fp = fopen("./test.txt","w"); 
    fputs("Test\n", fp); 
    fclose(fp); 
    printf("Printed to txt\n"); //Prints normally. 

    fp = fopen("/dev/testchar", "w");   
    fputs("Test\n", fp); 
    fclose(fp); 
    printf("Printed to dev\n"); //Never gets to this point 

    return 0; 
} 

私がコンパイルしたコードを実行すると、プログラムが

Printed to txt

、ちょうどCtrl + Cキーが呼び出されるまでハングを吐き出します。それは第二のfputs()を越えることはありません。

kern.logを監視している間は、デバイスドライバに書き込むための無限の呼び出しがあります。ここで

は、私は、デバイスドライバから該当するコードを抽出しています

static char msg[256] = {0}; 

static struct file_operations fops = 
{ 
    .write = dev_write 
}; 


static ssize_t dev_write(struct file *file, const char *buf, size_t len, loff_t *ppos) 
{ 
    sprintf(msg, "Input:%s, Chars:%lu\n", buf, len); 
    printk(KERN_NOTICE "%s\n", msg); 

    return 0; 
} 

uname -r: 4.10.0-38-generic

gcc -v: gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.4)

私の質問は:への書き込み時にプログラムが無限ループに立ち往生している理由デバイス、どうすれば修正できますか?

ありがとうございます。どんな助けでも大歓迎です。

+0

これはわかりません。 クローズ操作を処理する必要はありませんか? 'file_operations Fops'のhttps://linux.die.net/lkmpg/x892.html' .release' '.write'を見てください –

答えて

4

私は、カーネル書き込み操作は書き込まれたバイト数を返すと考えられます。システムコールがすべてのデータを書き出していないと仮定すると、ユーザー空間コードはstdioを使用しているため、ユーザー空間コードは書き込みを再試行します。入力の長さを返すと、stdioはすべてのデータが書き込まれたことを知ります。代わりに、fputsではなくwriteシステムコールを直接使用することもできます。あなたのカーネルコードは間違っていますが、あなたのプログラムは終了します。 straceを使用してこれをテストし、すべてのシステムコールを確認できます。

+0

lenを返すようにwriteシステムコールでリターン0を変更しました。助けてくれてありがとう! – CallMeTheMan

関連する問題