- Czy można bezpiecznie korzystać
lseek(fd,0)
a następnieread(fd,buf)
dla/proc/stat
plik zamiast wznowienie go dostać aktualizowane zawartość tego pliku następnym razem? - Co naprawdę robi wywołanie
mmap()
po otwarciu tego pliku (patrz poniżej)?
Problem, który napotykam, polega na tym, że najlepsze raporty to zbyt niskie użycie procesora (10% w porównaniu do 100% w przypadku przerwania oprogramowania). Strace wskazuje, że top nie otwiera ponownie tego pliku, ale zamiast tego lseksuje na początek i czyta go jeszcze raz. I w jakiś sposób zawartość, która zostanie odczytana z tego pliku następnym razem, nie pasuje do tego, co otrzymam, gdy uruchomię program cat tylko dla pliku /proc/stat
.jest to bezpieczne w użyciu lseek() podczas odczytu z Proc-FS Pliki raz drugi
Również, jeśli uruchomię top i cat /proc/stat
w pętli w tym samym czasie, wówczas top zacznie raportować poprawne użycie procesora.
Jeszcze jedna różnica, którą dostrzegam, to to, że najlepsze połączenie używa mmap()
zaraz po otwarciu pliku /proc/stat
, podczas gdy cat
nie robi tego. Nie jestem pewien, czy to może być również związane z moim problemem (bo filesdes=-1
tutaj):
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f7b37649000
Używam wydanie Ubuntu 10.04.1 pulpitu z 2.6.32-27-serwer obrazu. Procesor to Intel Q6600.
Tak jest w przypadku lseek. Wydaje się, że htop jest zaimplementowany do ponownego otwierania pliku/proc/stat za każdym razem przed jego odczytaniem, ale w międzyczasie htop zgłasza również nieprawidłowe użycie procesora. Możemy więc prawdopodobnie wykluczyć lseek(). –