2011-12-15 2 views
1

이 문제를 해결할 수있는 솔루션을 찾고 있습니다. select으로 procfs 파일의 변경 사항을 모니터하고 싶습니다. 소켓에 다른 설명자를 보았 기 때문에 이 아니라 select을 사용하고 싶습니다.procfs 파일에서 함수를 선택하십시오.

나는 이런 식으로 뭔가를 시도했다 : 파일이 항상 읽을 준비가되어 있기 때문에

fd1 = open("/proc/my_file", O_RDONLY, 0); 
FD_ZERO(&rfds); 
FD_SET(fd1, &rfds); 

tv.tv_sec = 500; 
tv.tv_usec = 0; 
retval = select(fd1+1, &rfds, NULL, NULL, &tv); 

이것은 잘못이다. select으로 파일에 변경 사항이있는 경우 어떻게 알림을받을 수 있습니까?

+0

왜'select'를 사용할 필요가 없습니다.전체 파일을 읽고 변경 사항을 분석 할 수 있습니다. procfs 파일은 그다지 크지 않습니다. 따라서 그것은 당신의 성과에서 너무 많이 벗어나서는 안됩니다. –

답변

4

select(2) "변경 가능"이 아니라 "준비 상태"로보고됩니다. OpenGroup select() manpage에서 : 일반 파일과 관련된

파일 기술자 항상 읽을 준비가 쓸 준비 및 오류 조건에 대한 진정한 선택합니다. 그들은 매우 "일반 파일"아니에요 - -

커널에서 제공하는 파일은 좀 이상하지만 select(2)이러한 파일의을 변경 결정하는 도구가 아닙니다.

변경 사항을 확인하려면 inotify(7)을 사용해야합니다. procfs(5)에있는 모든 파일이이 메커니즘을 사용하지 않는다면 실제로 놀라지 않을지라도, 많은 사람들이 기본 데이터가 변경 될 때 을 알고 있습니다.을 알 수 있습니다. /proc/loadavg을 고려해보십시오. 읽을 때마다 변경 될 수 있지만, 변경 사항이 표시되는 실제 지점은 inotify(7)입니다.

+0

사실 그것은 전화가 차단되지 않는다는 것을 의미하지 않습니다. –

+0

매트 : 스펙을 다시 읽도록 강요 해줘서 고마워. – sarnold

+0

아무 문제도, 이것도 배웠을 때 힘든 교훈이었다. –

0

파일 설명자에 변경 사항이 있는지 알고 싶으면 libevent 라이브러리를 사용할 수 있습니다.

libevent는 비동기 이벤트 알림 소프트웨어 라이브러리입니다. libevent API는 특정 이벤트가 파일 설명자에서 발생하거나 시간 제한이 에 도달했을 때 콜백 함수를 실행하는 메커니즘을 제공합니다. 또한, libevent는 시그널이나 정기적 인 타임 아웃으로 콜백을 지원합니다.

현재 libevent 지원은/dev/여론 조사, kqueue (2), (2), 여론 조사 (2), 는 epoll (4) 및 Solaris의 이벤트 포트

을 선택하거나 당신은 또한 사용할 수 있습니다 epoll.

epoll은 Linux 2.5.44 1에서 처음 소개 된 Linux 용 확장 가능 I/O 이벤트 알림 메커니즘입니다. 오래된 POSIX select (2) 및 poll (2) 시스템 호출을 대체하여보다 많은 요구 응용 프로그램에서 더 나은 성능을 얻으려고합니다. n), epoll은 O (1) [2]에서 작동합니다. epoll은 FreeBSD의 kqueue와 비슷합니다. 구성 가능한 커널 객체에서 작동하며 사용자 공간에 자체 파일 설명자로 표시됩니다.

Example of using epoll

+2

'epoll'은 깔끔하지만, _changes_ 파일에 대해서는 모른다. 파일이 _ready to read_인지 여부 만 알 수있다. – sarnold

관련 문제