2012-07-04 2 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); 

Это не каротаж проблема, водитель также ведет себя как в блокирующем режиме.

Любая идея?

EDIT:

код, который считывает из открытого файла совсем просто:

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

Я также проверил программу, если есть fcntl() somewere еще, но нет ..

EDIT 2:

Возможно ли, что O_NONBLOCK имеет другое значение в моей пользовательской программе (Android NDK), чем в ядре? Я искал O_NONBLOCK в заголовках ядра и уже существует 2 разных определения.

Я также проверил open -внедрение в моем модуле ядра и там уже filp->f_flags это неO_NONBLOCK.

+0

Покажите нам код, выполняющий 'read'. – cnicutar

+0

Добавлена ​​строка 'read'. –

+2

Открытие файлов с 'O_NONBLOCK' приводит к UB (a.k.a. _unspecified behaviour_) согласно [спецификациям] (http://pubs.opengroup.org/onlinepubs/000095399/functions/open.html). –

ответ

1

Согласно open(2) man-page, минуя O_NONBLOCK, только делает вызов open самоблокирующимся (которого вы, возможно, не хотите). Это не означает, что открытый файловый дескриптор также будет находиться в неблокирующем режиме - вы должны установить это с помощью fcntl() после открытия.

 Смежные вопросы

  • Нет связанных вопросов^_^