如何使用C语言在Linux中获取物理CPU的数量?

8 浏览
0 Comments

如何使用C语言在Linux中获取物理CPU的数量?

我知道sysconf(_SC_NPROCESSORS_ONLN)可以得到逻辑处理器的数量。但是我该如何获得物理处理器的数量呢?

0
0 Comments

问题出现的原因是:在Linux系统中,/proc/cpuinfo文件中不会显示离线CPU。而CPU的拓扑结构信息可以在/sys/devices/system/cpu/cpu*/topology/*目录下找到。

解决方法如下:

#include 
#include 
#include 
int getNumberOfPhysicalCPUs() {
    int count = 0;
    FILE* fp = fopen("/sys/devices/system/cpu/online", "r");
    if (fp == NULL) {
        printf("Failed to open /sys/devices/system/cpu/online\n");
        return -1;
    }
    
    char line[256];
    if (fgets(line, sizeof(line), fp) != NULL) {
        char* token = strtok(line, "-");
        int start = atoi(token);
        token = strtok(NULL, "-");
        int end = atoi(token);
        count = end - start + 1;
    }
    
    fclose(fp);
    return count;
}
int main() {
    int numCPUs = getNumberOfPhysicalCPUs();
    if (numCPUs > 0) {
        printf("Number of physical CPUs: %d\n", numCPUs);
    }
    return 0;
}

文章如下:

在Linux系统中,/proc/cpuinfo文件提供了关于CPU的详细信息,但是该文件并不会显示离线CPU。如果我们想要获取Linux系统中物理CPU的数量,我们可以通过查看/sys/devices/system/cpu/online文件来获得。

为了解决这个问题,我们可以使用C语言编写一个函数来获取物理CPU的数量。以下是一个用于获取物理CPU数量的示例代码:

#include 
#include 
#include 
int getNumberOfPhysicalCPUs() {
    int count = 0;
    FILE* fp = fopen("/sys/devices/system/cpu/online", "r");
    if (fp == NULL) {
        printf("Failed to open /sys/devices/system/cpu/online\n");
        return -1;
    }
    
    char line[256];
    if (fgets(line, sizeof(line), fp) != NULL) {
        char* token = strtok(line, "-");
        int start = atoi(token);
        token = strtok(NULL, "-");
        int end = atoi(token);
        count = end - start + 1;
    }
    
    fclose(fp);
    return count;
}
int main() {
    int numCPUs = getNumberOfPhysicalCPUs();
    if (numCPUs > 0) {
        printf("Number of physical CPUs: %d\n", numCPUs);
    }
    return 0;
}

通过调用`getNumberOfPhysicalCPUs`函数,我们可以获取Linux系统中的物理CPU数量,并将其打印出来。

这样,我们就可以轻松地在Linux系统中使用C语言获取物理CPU的数量了。

0
0 Comments

在Linux中使用C语言获取物理CPU数量的最佳方法是使用hwloc。hwloc提供了一组用户工具,可以让您获取系统的cpu拓扑结构,同时也提供了一个可以从C语言中使用的库。

要解决这个问题,可以使用hwloc提供的库来获取物理CPU数量。以下是使用hwloc库的示例代码:

#include

#include

int main() {

hwloc_topology_t topology;

hwloc_topology_init(&topology);

hwloc_topology_load(topology);

int num_cpus = hwloc_get_nbobjs_by_type(topology, HWLOC_OBJ_PU);

printf("Number of physical CPUs: %d\n", num_cpus);

hwloc_topology_destroy(topology);

return 0;

}

通过使用hwloc库的相关函数,可以初始化topology对象,并加载系统的拓扑结构。然后,可以使用hwloc_get_nbobjs_by_type函数来获取物理CPU的数量,并将其打印出来。

通过上述方法,可以很方便地在Linux中使用C语言获取物理CPU数量。

0
0 Comments

在Linux中使用C语言获取物理CPU数量的原因是因为需要在编程中获取系统的硬件信息,特别是CPU的数量。解决方法可以通过解析/proc/cpuinfo文件并计算不同的"physical id:"行的数量来实现。如果使用具有正则表达式支持的GLib或其他库,这将更容易。或者,如果想要更加hacky的方法,可以使用popen()函数来执行命令行来获取相同的信息。具体的命令行示例可以参考http://www.brandonhutchinson.com/Understanding_proc_cpuinfo.html网站。

在任何POSIX系统上,包括Linux,POSIX正则表达式支持(BRE和ERE)都是标准库的一部分,因此不需要额外的GLib库支持。

0