2012-07-04 3 views
4
내 C 프로그램에서 파일을 여는하고

손실됩니다.열린 파일 O_NONBLOCKING은 커널 모듈

하지만 내 문제는 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); 

을 시도했다.

누구나 아이디어가 있으십니까?

편집 :

열린 파일에서 읽는 코드는 절대적으로 간단하다 : 아니, 그 밖에 fcntl() somewere이 있다면 나는 또한 프로그램을 확인

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

하지만 ..

편집 2 :

O_NONBLOCK이 내 사용자 프로그램 (Android NDK)의 커널에있는 값과 다른 값을 가질 수 있습니까? 커널 헤더에서 O_NONBLOCK을 검색했는데 이미 두 가지 다른 정의가 있습니다.

나는 또한 내 커널 모듈에서 open -implementation을 확인하고 이미 하지 O_NONBLOCKfilp->f_flags입니다.

+0

'읽기'를 수행하는 코드를 보여주십시오. – cnicutar

+0

'read' 행을 추가했습니다. –

+2

'O_NONBLOCK' 파일을 열면 [specs] (http://pubs.opengroup.org/onlinepubs/000095399/functions/open.html)에 따라 UB (a.k.a. _unspecified behaviour_)가됩니다. –

답변

1

open(2) man-page에 따르면 O_NONBLOCK을 전달하면 open이 호출 자체를 차단하지 않습니다 (사용자가 원하지 않는 경우). 열린 파일 디스크립터도 비 블로킹 모드에 있다는 것을 의미하지는 않습니다. 열기 후에 fcntl()을 사용하여 파일 디스크립터를 설정해야합니다.