2010-12-23 4 views
3

write()를 사용하는 것이 가능합니다. 스레드를 사용하지 않고 비 블로킹 기능을 사용합니까?장치에 넌 블로킹 쓰기를 수행하는 방법은 무엇입니까?

short buffer[BUFFER_LEN]; 
int readcount; 

while ((readcount = sounds[index].read(buffer, BUFFER_LEN))) 
    write(audio_device, buffer, readcount * sizeof(short)); 

사운드는 재생되지만 재생이 끝날 때까지 프로그램을 차단합니다.

+0

그렇습니다. 스레드 안전이없는 쓰기 기능을 사용하면 같은 정보를 사용하는 다른 스레드와 동시에 다른 동작이 발생할 수 있습니다. –

답변

3

fcntl을 사용하여 파일에 O_NONBLOCK 플래그를 설정하면 효과가 있지만 부분 쓰기 및 EWOULDBLOCK 오류를 처리 할 준비가 필요합니다.

+0

O_NONBLOCK 플래그를 in에 추가했지만 소리가 왜곡됩니다. 그럼 내가 쓰레드를 사용해야 할 것 같네요. –

+1

왜냐하면'write'의 반환 값을 무시하기 때문입니다. 파일 디스크립터가 비 블로킹이면'write'는'errno'가'EWOULDBLOCK'으로 설정된 상태로 -1을 반환 할 수 있습니다.이 경우 나중에 기다려야하고 다시 쓰기를 시도해야합니다. 그리고 물론'write'는 요청한 바이트 수보다 적게 리턴 할 수 있습니다.이 경우에는 나머지를 버퍼링하고 나중에 써야합니다. –

+0

설문 조사를 사용해야하는 경우 몇 가지 샘플 코드 또는 내가 읽고 있어야하는 곳을 알려주시겠습니까? –

관련 문제