将C代码转换为Golang代码的实用指南

将C代码转换为Golang代码的实用指南 能否将这段C代码转换为Go代码?

#include <stdio.h>
#include <string.h>

float get_cpu_clock_speed () {

FILE* fp ;
char buffer [1024];
size_t bytes_read;
char* match ;
float clock_speed ;

fp = fopen ("/proc/cpuinfo", "r");
bytes_read = fread(buffer, 1, sizeof (buffer), fp);
fclose (fp);

if (bytes_read == 0 || bytes_read == sizeof (buffer))
	return 0;

buffer[bytes_read] = ’\0’;
match = strstr (buffer, "cpu MHz");
if (match == NULL)
	return 0;
sscanf (match, "cpu MHz : %f", &clock_speed);
return clock_speed;

}

int main()
{
printf("CPU clock speed: %4.0f MHz\n", get_cpu_clock_speed() );
return 0;
}

更多关于将C代码转换为Golang代码的实用指南的实战教程也可以访问 https://www.itying.com/category-94-b0.html

13 回复

你能帮我解析proc文件系统中每5秒更新一次的运行时间值吗?

更多关于将C代码转换为Golang代码的实用指南的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


你是说这个吗?

$ cat /proc/uptime
334147.08 464782.69

不。

请先描述这段C代码的功能。然后向我们展示你尝试将其转换为Go语言的成果。你的代码能正常运行吗?如果不能,它出现了什么问题?

是的……你能帮我写一个Go代码来提取它吗?这个代码需要每5秒更新一次。

使用Go语言从Linux的proc文件系统中提取运行时间信息

这是新的讨论主题 请审阅

它起作用了 非常感谢

希望您能理解这段代码的作用。请查阅包文档以了解我所使用函数的功能说明。

那么你基本上想要执行这个命令?

$ cat /proc/cpuinfo | grep 'cpu MHz'
cpu MHz         : 800.000
cpu MHz         : 800.000
cpu MHz         : 800.000
cpu MHz         : 800.000

请就此问题开启一个新主题。

请附上您已尝试的 Go 代码,并说明您希望从 /proc/uptime 中获取哪些信息。

我正在开发一个监控工具项目。在/proc/cpuinfo文件中,我需要提取以vendor_id、model name、cpu MHz等开头的行信息。

我对Go编程语言还比较陌生,所以想请教您能否提供帮助。

func main() {
    fmt.Println("hello world")
}

这段代码用于获取在Linux系统/proc/cpuinfo文件系统中创建的CPU信息,具体是提取以"cpu MHz"开头的行。

func get_cpu_clock_speed () {
file, err := os.Open(`/proc/cpuinfo`)
if err != nil {
log.Fatal(err)
}
defer file.Close()

buf := make([]byte, 1024)
for {
	n, err := file.Read(buf)
	if err != nil && err != io.EOF {
		panic(err)
	}
	if n==0 {
		break
	}
}

这是我尝试转换的全部内容。 如何从该文件系统中提取信息并存储到缓冲区,以便获取以"cpu MHz"开头的行?

尝试以下代码:

package main

import (
	"bufio"
	"fmt"
	"log"
	"os"
	"strings"
)

func main() {
	// 打开 /proc/cpuinfo 进行读取,完成后关闭文件
	file, err := os.Open("/proc/cpuinfo")
	if err != nil {
		log.Fatal(err)
	}
	defer file.Close()

	// 创建逐行读取的扫描器
	scanner := bufio.NewScanner(file)

	// 遍历每一行
	for scanner.Scan() {
		line := scanner.Text()

		// 如果行以 "cpu MHz" 开头,则打印该行
		if strings.HasPrefix(line, "cpu MHz") {
			fmt.Println(line)
		}
	}

	if err := scanner.Err(); err != nil {
		log.Fatal(err)
	}
}

以下是这段C代码转换为Go语言的等效实现。Go语言提供了更简洁的文件操作和字符串处理方式,同时需要注意错误处理。

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)

func getCPUFrequency() float64 {
	file, err := os.Open("/proc/cpuinfo")
	if err != nil {
		return 0
	}
	defer file.Close()

	scanner := bufio.NewScanner(file)
	for scanner.Scan() {
		line := scanner.Text()
		if strings.HasPrefix(line, "cpu MHz") {
			parts := strings.Split(line, ":")
			if len(parts) == 2 {
				freqStr := strings.TrimSpace(parts[1])
				freq, err := strconv.ParseFloat(freqStr, 64)
				if err == nil {
					return freq
				}
			}
		}
	}
	return 0
}

func main() {
	frequency := getCPUFrequency()
	fmt.Printf("CPU clock speed: %4.0f MHz\n", frequency)
}

主要转换说明:

  1. 文件操作使用os.Openbufio.Scanner,这是Go中读取文件的惯用方式
  2. 使用defer确保文件正确关闭
  3. 逐行扫描文件内容,使用strings.HasPrefix查找包含"cpu MHz"的行
  4. 使用strings.Split分割键值对,strconv.ParseFloat解析频率值
  5. 完整的错误处理机制

这个Go版本会返回第一个CPU核心的频率值。如果需要获取所有核心的频率,可以修改代码来收集所有匹配的行。

回到顶部