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)中的值比内核中的值不同?我O_NONBLOCK在内核头文件中搜索,已经有 2 个不同的定义。

我还检查了open内核模块中的 -implementation 并且filp->f_flags已经没有 O_NONBLOCK.

4

1 回答 1

1

根据open(2) man-page,传递O_NONBLOCK只会使open调用本身非阻塞(您可能不想要)。这并不意味着打开的文件描述符也将处于非阻塞模式——您必须在打开后使用 fcntl() 进行设置。

于 2012-10-19T16:15:04.623 回答