私はLinux用の簡単な文字デバイスドライバを書いています。charデバイスドライバを "cat"しようとすると、エラーメッセージが表示されるのはなぜですか?
メッセージがカーネル空間に格納されるシンプルなメッセージ格納/検索システムです。
echo "message 1" > /dev/mydevice
をして、メッセージがキューに格納されている
cat /dev/mydevice
でメッセージを取得:
私はこのような何かを行うことができるはず。
私は(メッセージが「こんにちは」である)私は、ハードテストのためでコード化されたメッセージを取得しようとすると、私は次のコマンドライン出力を得る:
cat /dev/mydevice
hellocat: /dev/mydevice: Resource temporarily unavailable
意図したとおりだから私は、helloメッセージを取得しかし、明らかに私はかなり正しくないことをしています。
ここでは、デバイスの読み取りを処理する関数があります。それは(signified by read
returning 0ある)EOFに到達するまで
static ssize_t device_read(struct file *filp, char *buffer,
size_t length, loff_t * offset) {
unsigned long result;
int message_size;
struct message_list* message = pop_message(&global_message_list);
if (!message) return -EAGAIN;
message_size = message -> message_length;
result = copy_to_user(buffer, message -> message, message_size);
printk(KERN_ALERT "res: %lu, msg_size: %d, len: %d\n", result, message_size, length);
if (result == 0) return message_size;
else return message_size - result;
}
私は 'cat'がEOFに達するまで(' read'は0を返します)、読み込みを試みていると思います。この場合、メッセージがなくなるとすぐに 'EAGAIN'に行きます。'' hello "'の後に空のメッセージをハードコーディングし、それが動作するかどうか確認してください。これが実際の問題であれば、おそらく最良の解決策ではないかもしれませんが、テストするのは簡単ですが、1つのメッセージをスレッドセーフな方法で各リーダーに正確に返すことは難しいでしょう) –
メッセージがなくなったときにEAGAINを返すことは、私の割り当ての要件の一部です。私は、私がEOFのために0を返す必要があることを考えれば、これをどのように克服することができるかについて少し混乱しています。 – toastedDeli
@DanielHまた、それは猫が私の読み取り機能を複数回呼び出すことを意味するのでしょうか?私は伝統的に読み込みバイト数を返すと思った。 – toastedDeli