2012-07-04 53 views
4

我在我的C程序中打开一个文件:打开文件O_NONBLOCKING丢失内核模块

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

,过一会儿给它select()read()

但我的问题是,该O_NONBLOCK被somewere丢失:

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() somewere人,但没有..

编辑2:

有可能的是,O_NONBLOCK在我的用户程序(的Android NDK)的其他值不是内核?我在内核头文件中搜索了O_NONBLOCK,并且已经有2个不同的定义。

我还检查open - 实施我的内核模块,并且已经有filp->f_flagsO_NONBLOCK

+0

显示我们执行'read'的代码。 – cnicutar

+0

增加了'read'-line。与UB'O_NONBLOCK'结果(也称为_unspecified behaviour_),按照[规格] –

+2

打开文件(http://pubs.opengroup.org/onlinepubs/000095399/functions/open.html)。 –

回答

1

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