Browse Source

Better handling of reading the first line of /proc/stat

Oz Tiram 5 years ago
parent
commit
3cbb215a9e
1 changed files with 18 additions and 10 deletions
  1. 18 10
      cmd/main.go

+ 18 - 10
cmd/main.go

@@ -10,17 +10,30 @@ import (
 	"time"
 )
 
-func readProcStatLine() string {
-	f, err := os.Open("/proc/stat")
-	defer f.Close()
-	rd := bufio.NewReader(f)
+func readFirstLine(rd *bufio.Reader, f *os.File) string {
 	line, err := rd.ReadString('\n')
 	if err != nil {
 		log.Fatalf("could not read /proc/stat, error: %v", err)
 	}
+	rd.Reset(f)
+	f.Seek(0, 0)
 	return line
 }
 
+func readProcStatLines(freq int) (string, string) {
+	var line, newline string
+	f, err := os.Open("/proc/stat")
+	if err != nil {
+		log.Fatalf("could not read /proc/stat, error: %v", err)
+	}
+	defer f.Close()
+	rd := bufio.NewReader(f)
+	line = readFirstLine(rd, f)
+	time.Sleep(time.Duration(freq) * time.Second)
+	newline = readFirstLine(rd, f)
+	return line, newline
+}
+
 func main() {
 	var freq int
 	var partition, netInterface string
@@ -37,15 +50,10 @@ func main() {
 	flag.Parse()
 
 	fmt.Println(gupta.Hello())
-	line := readProcStatLine()
-	time.Sleep(time.Second)
-	lineNew := readProcStatLine()
 
 	for true {
+		line, lineNew := readProcStatLines(freq)
 		cpustat := gupta.NewCPUStat(line, lineNew)
 		fmt.Printf("CPU usage %.2f%%\n", cpustat.CPUUsage())
-		time.Sleep(time.Duration(freq) * time.Second)
-		line = lineNew
-		lineNew = readProcStatLine()
 	}
 }