2011-01-24 3 views
8
  1. lseek(fd,0)을 사용해도 안전하고 대신이 파일 다음의 업데이트 된 내용을 얻기 위해 그것을 재개 후 read(fd,buf)/proc/stat의 파일?
  2. 그리고이 파일을 연 후에 mmap() 호출이 실제로 수행하는 작업 (아래 참조)은 무엇입니까?

내가 겪고있는 문제는 너무 낮은 CPU 사용량 (소프트웨어 인터럽트의 경우 10 % 대 100 %)입니다. strace는 top이이 파일을 다시 열지는 않지만 처음에는 시작으로 다시 읽음을 나타냅니다. 그리고 어쨌든 다음에이 파일에서 읽는 내용은 고양이를 /proc/stat 혼자서 사용할 때 얻을 수있는 것과 일치하지 않습니다.이 안전 lseek의를 사용하는 것입니다() PROC-FS에서 읽을 때이 두 번째 파일

또한 상단과 고양이 /proc/stat 루프를 동시에 실행하면 top은 정확한 CPU 사용을보고하기 시작합니다.

더 많은 차이점은 /proc/stat 파일을 연 직후에 mmap()을 사용하는 것이고 cat은 그렇게하지 않는 것입니다. 이은 (여기 filesdes=-1 때문에) 내 문제와 관련이있을 수 있는지 확실하지 않다 : 나는 2.6.32-27-서버 이미지와 우분투 10.04.1 데스크톱 버전을 사용하고

mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f7b37649000 

. CPU는 Intel Q6600입니다.

답변

4

당신이 묻는 것이 매우 흥미 롭습니다. 내 컴퓨터를 확인하기 시작하지만 cat/proc/stat 사이의 차이점을 보지 않고 상단을 실행합니다. 어쨌든, 나는 일하고 있고, 테스트를하는 것이 완전히 자유롭지는 않습니다.

새 데이터를 읽도록 열린 파일을 '새로 고침'하는 방법은 정확합니다 ... [f | l] seek() 호출이 끝날 때까지 파일의 시작 부분을 업데이트하면 EOF와 새로운 데이터가 읽혀질 것입니다.

mmap() 호출이 언급 한 문제를 일으킬 것이라고 생각하지 않습니다. 읽기가 더 빠를 수는 있지만 다른 것은 없습니다 (100 % 확신 할 수 없음).

C에서/proc/stat를 열고, 읽고, 찾으며, 업데이트 방법을보기 위해 다시 읽는 작은 앱을 만들 것을 제안합니다. 유용 할 수있는 스트레스 테스트가있는 경우에도 사용하십시오.

지금, 당신의 실제 질문에 대답 :

  1. 이 파일에 새로운 데이터를 '대기'되고 열려보다 더하고 파일을 항상 닫아야하기 때문에 예, AFAIK 그것은 확실히이다 .

  2. 그것은 프로세스 주소 공간에 파일을 매핑
  3. 는 여기에 몇 가지 정보와 예는 다음과 같습니다

http://www.gnu.org/s/libc/manual/html_node/Memory_002dmapped-I_002fO.html http://www.linuxquestions.org/questions/programming-9/mmap-tutorial -cc-511265/

+0

사실 lseek에 대해 사실입니다. htop은 읽기 전에 매번/proc/stat 파일을 다시 열도록 구현되어 있지만 htop은 또한 잘못된 CPU 사용을보고합니다. 그래서 lseek()를 배제 할 수 있습니다. –