2010-01-17 2 views
0

하나의 스레드 된 코코아 응용 프로그램을 작성 중이며 논 블로킹 IO를 수행하기 위해 NSNotificationCenter 유틸리티 방법론을 사용하려고합니다 (코코아로 처리되는 방식 인 것 같음).닫기 호출은 Cocoa의 비동기 IO를 사용하여 영원히 걸릴 수 있습니까?

파일 핸들이 닫힌 경우를 제외하고는 모두 을 제외하고는 모두을 제외하면 제대로 작동하는 것 같습니다. 결국 결국 알려주지 만 영원히 걸립니다. 아무도 왜 이것이 될 것이라고 설명 할 수 있습니까?

더 구체적으로 말하자면, 프로세스를 긋고 그 stdout을 읽는 화면 보호기를 쓰고 있습니다. 동작은 컨텍스트에 따라 변경됩니다. 시스템 환경 설정의 미리보기 창에서 실행 중이면 테스트 버튼을 클릭 할 때 전체 화면으로 실행될 때 더 빨리 닫히는 것을 알립니다.

편집 : 약간의 생각을하고 나면, 문제는 마지막 쓰기와 닫기가 거의 동시에 발생한다는 것입니다. 마지막 읽기는 NSFileHandle이 닫힌 후에 발생하며 데이터를 반환합니다 (EOF가 아닌 경우). 나는 그것을 기다리면서 끝내지 만, 파일 핸들이 비활성 상태이므로 메인 루프는 실행을 알리는 신호가 없으므로 차단 상태를 유지합니다. 미리보기 모드가 작동하는 이유는 시스템 환경 설정 윈도우에서 무언가를 클릭 할 때마다 메인 루프가 강제로 실행되고 기다리고있는 NSFileHandle의 상태를 확인하고 닫히기 때문입니다.

지금 무슨 일이 일어나는 지 알 것 같지만, 여전히 차단하지 않고 NSFileHandle을 닫는 방법을 알 수는 없습니다.

이 문제는 화면 보호기가 실행 중일 때만 나타나는 것으로 보입니다.

답변

-1

... 당신의 퍼레이드에서는 비가 내리지 않지만 I/O는 일반적으로 The Way To Go 인 NSStream 클래스가 소개 된 이후 10.3 (IIRC) 이후 크게 재 작성되었습니다. (물론 NSFileHandle은 여전히 ​​잘 작동하지만 최신이며 가장 멋진 것은 아닙니다.)

또한 닫은 후에 읽으시겠습니까? 응?

+0

닫기가 끝난 후 읽으십시오 (이미 버퍼 된 데이터를 모두 읽은 것으로 가정) EOF를 의미하는 0 바이트를 반환합니다. 나는'NSFileHandle'을 생성하는 프로세스를 fork하기 위해'NSTask'를 사용하고 있습니다. NSSTream은 네트워크 소켓 전용으로 생각되기 때문에 원하는 것은 아니라고 생각합니다. – jdizzle

+0

"같은시기에 일어난다"라는 말을 어떻게 의미합니까? 다른 스레드에서 의미합니까? 또한 "닫기 후 읽기는 0 바이트를 반환합니다"라고 생각하게하는 이유는 무엇입니까? 문서에는 예외가 발생한다고 명확히 명시되어 있습니다. –

+0

마지막 쓰기 및 닫기는 모두 하위 프로세스에서 발생합니다. close 후 읽기는 적어도 한 번 0 바이트를 반환합니다. 그것이 당신이 EOF에 있다는 것을 당신이 아는 방식입니다. 만약 당신이 NSFileHandle 문서를 참조한다면, 파일 핸들을 읽는 중에 에러가 발생하면 예외를 던진다. EOF는 오류가 아닙니다. – jdizzle

관련 문제