0

私は Android で自己コーディングしたカーネル モジュールを持っていO_RDONLY|O_NONBLOCKます。

O_NONBLOCK2048ユーザープログラムとカーネルモジュールの両方にあります。

私はそれをチェックしました

print..("O_NONBLOCK is %d", O_NONBLOCK)

ユーザー空間とカーネル空間で。

しかし、今、O_NONBLOCK設定されているかどうかを確認しようとすると、本当に奇妙な問題が発生しました。

static int my_open(struct inode *inode, struct file *filp) {

    if (filp->f_flags & O_NONBLOCK) {
        printk("O_NONBLOCK");
    } else {
        printk("NOT O_NONBLOCK");
        printk("O_NONBLOCK in my_open is: %d", O_NONBLOCK); // -> prints 2048
        printk("filp->f_flags in my_open is: %d", filp->f_flags); // -> prints 1, not 2048 or larger
    }
..
}

私は何か他のことを試しました:

cat my_device

繰り返しになりますが、filp->f_flagsです1

私はおそらく0のためにと思いますが、どちらが意味するO_RDONLYわけではありません。1O_WRONLY

誰でもアイデアや説明はありますか?

編集:

beeingも期待していませんが、完全に間違っています。catO_NONBLOCKO_WRONLY

私はこのように開きます:

pcm->dfd=open(fname, O_RDONLY|O_NONBLOCK);

そして、それはfcntl後でありません(そして、それはまったく影響しないはずです。しかし、もちろん、運がなければmy_open「リセット」も試みました。O_NONBLOCKfcntl

4

1 に答える 1

0

実際、ユーザー空間が通過する必要があると思われるものを通過することを確認する必要があります。たとえば、「cat」が「NONBLOCK」を通過するとは信じがたいです。する理由はありません。

ユーザー空間の最後で strace を使用して、実際に何が渡されるかをテストします。

また、少しオフトピックですが、開いているときに O_NONBLOCK が設定されているかどうか気にしますか? 後で fcntl を使用して設定することもできることに注意してください。

シャチャー

于 2012-07-12T19:04:59.440 に答える