Я открываю файл в моей программе 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
.
Покажите нам код, выполняющий 'read'. – cnicutar
Добавлена строка 'read'. –
Открытие файлов с 'O_NONBLOCK' приводит к UB (a.k.a. _unspecified behaviour_) согласно [спецификациям] (http://pubs.opengroup.org/onlinepubs/000095399/functions/open.html). –