2011-01-21 11 views
5

Czytam z/proc/pid/task/stat, aby śledzić użycie procesora w wątku. fopen na/proc/pic/zadania/stat fget ciąg ze strumienia sscanf na struniebufor odświeżania strumienia podczas odczytu/proc

Mam problemy jednak coraz bufor strumieni, aby zaktualizować. Jeśli fget 1024 znaków, jeśli regreshes, ale jeśli fget 128 znaków, to nigdy nie aktualizuje i zawsze otrzymuję te same statystyki. Powtarzam strumień przed odczytem i próbowałem fsync.

Robię to bardzo często, więc wolałbym nie otwierać ponownie do pliku za każdym razem. Co to jest właściwy sposób?

Odpowiedz

4

Nie każdy program korzysta z buforowanych operacji we/wy.

W twoim przypadku, chciałbym po prostu użyć read(2) . W ten sposób można:

  • wyeliminować wszystkie nieświeże bufor kwestie
  • prawdopodobnie działać szybciej poprzez wyeliminowanie podwójnego buforowania
  • prawdopodobnie mniej pamięci
  • zdecydowanie uprościć wdrażanie

W przypadku takim, jak opisujesz, wzrost wydajności może nie mieć znaczenia na dzisiejszych niezwykle potężnych procesorach. Ale zwrócę uwagę, że programy takie jak cp(2) i inne ciężkie urządzenia do przenoszenia danych nie używają buforowanych pakietów we/wy.


1. Oznacza to, że open(2), read(2), lseek(2) i close(2).
2. A może przechwycić argument, w kwestiach związanych z tym ktoś zwykle oferuje "pomocną" sugestię w rodzaju fflush(stdin), a następnie pojawia się inna osoba, aby dokładnie wskazać, że fflush() jest zdefiniowany przez C99 na strumieniach wyjściowych tylko, i zwykle nierozsądnie jest polegać na zachowaniu specyficznym dla implementacji.

+1

Chciałem spróbować przejść z Fopen na jutro. Mam nadzieję, że to zadziała lepiej. –

+0

Hah, działa jak czar ... dzięki! –

Powiązane problemy