4

C プログラムでファイルを開いています。

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

select()そして後で呼び出しますread()

しかし、私の問題は、O_NONBLOCKが失われることです。

ssize_t my_read(struct file *filp, char __user *user_buffer, size_t bytes_requested, loff_t *capture_ptr) {

    if (filp->f_flags & O_NONBLOCK){
        LOGI("mode: O_NONBLOCK");
    }
    else{
        LOGI("mode: BLOCKING"); // <-- this is printed      
    }
    ..
}

私も試しました

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

// O_NONBLOCK does not work :/
int flags = fcntl(pcm->dfd, F_GETFL, 0);
fcntl(pcm->dfd, F_SETFL, flags | O_NONBLOCK);

これはロギングの問題ではなく、ドライバもブロッキング モードのように動作します。

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

編集:

開いたファイルから読み取るコードは非常に単純です。

size=read(pcm->dfd,inBuffer,inBufferBytes);

他に何かあるかどうかもプログラムをチェックしましたが、fcntl()違います..

編集2:

O_NONBLOCK私のユーザープログラム(Android NDK)では、カーネルとは別の値を持つ可能性がありますか?kernel-headers で検索したところO_NONBLOCK、すでに 2 つの異なる定義があります。

openカーネル モジュールの -implementationも確認しましたが、既にありfilp->f_flagsませ O_NONBLOCK

4

1 に答える 1