2012-02-24 3 views
0

유닉스에서 : 나는 FAMGamin을 겪었으며 클라이언트/서버 파일 모니터링 시스템을 제공하는 것 같습니다. 차라리 커널에 일부 inode를 모니터하도록 시스템을 지정하고 이벤트가 발생하면 다시 알려줍니다. Inotify은 그 측면에서 처음에 유망 해 보였습니다 : inotify_init1poll()을 차례로 반환하는 IN_NONBLOCK을 전달합시다. 그러나 모니터 된 파일에 대한 뉴스를 원한다면 정기적으로 호출해야한다는 것을 이해했습니다. 이제 나는 약간의 아이디어가 부족합니다.파일을 비동기로 모니터링

파일을 비동기 적으로 모니터링 할 항목이 있습니까?

추신 : 나는 아직 Windows를 보지 않았지만 그것에 대해서도 답을하고 싶습니다.

+0

'inotify'는 정확히 당신이 찾고있는 것입니다. inotify 파일 설명을'poll()'요청에 포함 시키면 읽을 수있는 inotify 이벤트가있을 때 반환됩니다. 평소와 같이'poll()'과 같이, 당신이 요청한 파일 디스크립터가 준비되지 않았고 타임 아웃이 만료되지 않은 한 차단할 것이다. 그럼 문제가 어디 있니? – Celada

+0

잘'poll()'호출을 블로킹하는 것은 정확히 내가 비동기라고 부르는 것과 정확히 똑같지 않다. – qdii

+0

inotify 이벤트 (또는 소켓에서 사용할 수있는 데이터 또는 다른 종류의 이벤트의)? 당신의 소프트웨어가 이벤트를 기다리고 구조화되어 있다면, 당신은 이미'poll()'또는 유사한 것을 호출하는 이벤트 루프를 가지고 있습니다. 대신 이벤트가 오기를 기다리는 동안 다른 코드를 실행하려면 별도의 스레드에서 수행해야 할 수도 있습니다.이 경우 메인 스레드는 계속 이벤트 루프를 사용하거나 그렇지 않으면 비 블로킹을 필요로하지 않습니다. IO를 사용하면'inotify'의'read()'를 차단하는 스레드를 하나 가질 수 있습니다. – Celada

답변

0

하지만 흥미로운 점은 유감 스럽지만 숨겨진 깊이에 관계없이 "비동기식"상태 일 때 설문 조사 또는 선택 통화 차단을 기반으로하는 메커니즘을 수락 할 수 없습니다.

한편, 나는 inotify_init1 플래그 IN_NONBLOCK으로 전달하여 비동기 적으로 inotify를 실행할 수 있다는 것을 알았습니다. 신호는 aio처럼 트리거되지 않으며 차단을 차단하는 read 호출은 errnoEWOULDBLOCK으로 대신 설정합니다.

2

Celada가 위의 의견에서 밝힌 바와 같이, inotify와 poll이이를 수행하는 올바른 방법입니다.

신호는 합리적인 비동기 프로그래밍을위한 메커니즘이 아니며, 신호 처리기는 경험이 부족하거나 경험이 많은 사람들에게 매우 위험합니다. 하나는 그러한 목적으로 자발적으로 사용하지 않습니다.

대신 poll, select 또는 유사한 시스템 호출을 프로그램 이벤트 처리 메커니즘의 핵심으로 사용하여 이벤트 루프 (전체 설명은 http://en.wikipedia.org/wiki/Event-driven_programming 참조) 주위에 프로그램을 구성해야합니다.

또는 스레드 또는 스레드와 이벤트 루프를 사용할 수 있습니다.