Is it possible to get such info by some API or function, rather than parsing the /proc/cpuinfo?
- 12,111
- 21
- 91
- 136
- 12,187
- 25
- 96
- 148
-
1Duplicate question. see answer: https://stackoverflow.com/a/55304841/236062 – Zibri Mar 22 '19 at 17:42
9 Answers
From man 5 proc:
/proc/cpuinfo This is a collection of CPU and system architecture dependent items, for each supported architecture a different list. Two common entries are processor which gives CPU number and bogomips; a system constant that is calculated during kernel initialization. SMP machines have information for each CPU.
Here is sample code that reads and prints the info to console, stolen from forums - It really is just a specialized cat command.
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
FILE *cpuinfo = fopen("/proc/cpuinfo", "rb");
char *arg = 0;
size_t size = 0;
while(getdelim(&arg, &size, 0, cpuinfo) != -1)
{
puts(arg);
}
free(arg);
fclose(cpuinfo);
return 0;
}
Please note that you need to parse and compare the physical id, core id and cpu cores to get an accurate result, if you really care about the number of CPUs vs. CPU cores. Also please note that if there is a htt in flags, you are running a hyper-threading CPU, which means that your mileage may vary.
Please also note that if you run your kernel in a virtual machine, you only see the CPU cores dedicated to the VM guest.
- 18,554
- 22
- 89
- 134
- 38,306
- 16
- 108
- 142
-
-
1@RamBhat - it is not _file_ in general sense. See the Wikipedia [article about procfs](http://en.wikipedia.org/wiki/Procfs) – Kimvais Mar 10 '12 at 10:21
-
I found this article very helpful, in terms of understanding the /proc/cpuinfo file - http://www.richweb.com/cpu_info – warunapww Oct 08 '12 at 05:47
You can use this for mostly all kind of linux distro
For C code
num_cpus = sysconf( _SC_NPROCESSORS_ONLN );
(In QNX systems , you can use num_cpus = sysinfo_numcpu())
For shell scripting, you can use cat /proc/cpuinfo
or use lscpu or nproc commands in linux
- 90,338
- 53
- 357
- 513
- 429
- 4
- 3
-
1this is the most 'programmatical', possibly simplest way; although man sysconf() specifies that the value "may not be standard" – Mark Jan 23 '15 at 11:08
-
For people who came here looking for help with QNX - there's no such method in base qnx660 as sysinfo_numcpu() – rasjani May 06 '16 at 09:56
libcpuid provides a simple API which will directly return all the CPU features, including number of cores. To get the number of cores at runtime, you could do something like this:
#include <stdio.h>
#include <libcpuid.h>
int main(void)
{
if (!cpuid_present()) {
printf("Sorry, your CPU doesn't support CPUID!\n");
return -1;
}
struct cpu_raw_data_t raw;
struct cpu_id_t data;
if (cpuid_get_raw_data(&raw) < 0) {
printf("Sorry, cannot get the CPUID raw data.\n");
printf("Error: %s\n", cpuid_error());
return -2;
}
if (cpu_identify(&raw, &data) < 0) {
printf("Sorrry, CPU identification failed.\n");
printf("Error: %s\n", cpuid_error());
return -3;
}
printf("Processor has %d physical cores\n", data.num_cores);
return 0;
}
- 70,661
- 34
- 192
- 269
-
-
1
-
yep, didn't really troubleshoot, just did `configure && make && sudo make install` and make failed, might be something really simple :) – Kimvais Mar 09 '12 at 07:57
Read /proc/cpuinfo
Sample Output
processor : 0
model name : Intel(R) Xeon(R) CPU E5410 @ 2.33GHz
cache size : 6144 KB
physical id : 0
siblings : 4
core id : 0
cpu cores : 4
processor : 1
model name : Intel(R) Xeon(R) CPU E5410 @ 2.33GHz
cache size : 6144 KB
physical id : 0
siblings : 4
core id : 1
cpu cores : 4
processor : 2
model name : Intel(R) Xeon(R) CPU E5410 @ 2.33GHz
cache size : 6144 KB
physical id : 0
siblings : 4
core id : 2
cpu cores : 4
processor : 3
model name : Intel(R) Xeon(R) CPU E5410 @ 2.33GHz
cache size : 6144 KB
physical id : 0
siblings : 4
core id : 3
cpu cores : 4
show_cpuinfo is the function which actually implements the /proc/cpuinfo functionality
- 27,404
- 12
- 99
- 125
Add following line in your source code..
system("cat /proc/cpuinfo | grep processor | wc -l");
This will print number of cpus in your system. And if you want to use this output of this system call in your program than use popen system call.
- 597
- 7
- 19
-
No its not, this will count the hyperthreads as well, please read - http://www.richweb.com/cpu_info for detailed info decoding /proc/cpuinfo file. – warunapww Oct 08 '12 at 05:51
-
Threads: cat /proc/cpuinfo | grep -c "cpu cores" ## Cores: cat /proc/cpuinfo | grep -m 1 "cpu cores"|cut -d ":" -f 2 – Zibri Mar 22 '19 at 15:49
Depending on your flavor of Linux you will get different results from /proc/cpuid.
This works for me on CentOS for getting total number of cores.
cat /proc/cpuinfo | grep -w cores | sed -e 's/\t//g' | awk '{print $3}' | xargs | sed -e 's/\ /+/g' | bc
The same doesn't work in Ubuntu. For Ubuntu you can use the following command.
nproc
- 543
- 2
- 7
-
Useless usage of `cat`. The following will work just fine: `grep -m1 "cores" /proc/cpuinfo | tr -d '[a-z]:[:space:]'` – Yokai Jan 10 '18 at 09:06
-
This is for use on a shell. OP asked how to do this programmatically in the C language, not in a shell. – Brian Reading Oct 04 '22 at 22:34
Parse the file /proc/cpuinfo. This'll give you lot of details about the CPU. Extract the relevant fields into your C/C++ file.
- 856
- 3
- 13
- 30
No, it is not. Either you must parse cpuinfo file, or some library will do it for you.
- 2,902
- 30
- 47
Have you ever seen the output of this shell command "cat /proc/cpuinfo"? I think there you can get out all the information that you need. To read the information in a C program I would prefer the file manipulation functions like fopen, fgets and so on.
- 1,282
- 4
- 17
- 37