2012-03-09 19 views

Respuesta

7

De 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. 

Aquí es código de ejemplo que lee e imprime la información a la consola, stolen from forums - Realmente es simplemente un comando especializado cat.

#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; 
} 

Tenga en cuenta que es necesario analizar y comparar la physical id, core id y cpu cores para obtener un resultado preciso, si realmente se preocupan por el número de CPU vs núcleos de CPU. También tenga en cuenta que si hay un htt en flags, está ejecutando una CPU Hyper-Threading, lo que significa que su kilometraje puede variar.

Tenga en cuenta que si ejecuta su kernel en una máquina virtual, solo verá los núcleos de la CPU dedicados al invitado de la VM.

+0

Pregunta curiosa. ¿Quién actualiza este archivo? – Laz

+1

@RamBhat - no es _file_ en sentido general. Ver la Wikipedia [artículo sobre procfs] (http://en.wikipedia.org/wiki/Procfs) – Kimvais

+0

Encontré este artículo muy útil, en términos de comprensión del archivo/proc/cpuinfo - http: //www.richweb. com/cpu_info – warunapww

4

Leer /proc/cpuinfo

Ejemplo de salida

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 es la función que en realidad implementa la funcionalidad /proc/cpuinfo

1

analizar el archivo/proc/cpuinfo. Esto te dará muchos detalles sobre la CPU. Extraiga los campos relevantes en su archivo C/C++.

0

¿Alguna vez ha visto la salida de este comando de shell "cat/proc/cpuinfo"? Creo que allí puedes obtener toda la información que necesitas. Para leer la información en un programa C, preferiría las funciones de manipulación de archivos como fopen, fgets, etc.

3

libcpuid proporciona una API simple que devolverá directamente todas las funciones de la CPU, incluida la cantidad de núcleos. Para obtener el número de núcleos en tiempo de ejecución, se podría hacer algo como esto:

#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; 
} 
+0

La biblioteca no compiló de fábrica en mi Linux Box. – Kimvais

+1

@Kimvais: Todo lo que puedo decir es que me funciona. – talonmies

+0

sí, realmente no solucioné problemas, simplemente 'configuró && make && sudo make install' y falló, podría ser algo realmente simple :) – Kimvais

1

Agregar la línea siguiente en el código fuente ..

system("cat /proc/cpuinfo | grep processor | wc -l"); 

Esto imprimirá el número de CPU en el sistema. Y si desea utilizar esta salida de este sistema, llame a su programa antes que usar la llamada al sistema popen.

+0

No, no, esto contará también los hyperthreads, por favor lea - http://www.richweb.com/cpu_info para obtener información detallada sobre el archivo de decodificación/proc/cpuinfo. – warunapww

1

No, no lo es. O bien debe analizar el archivo cpuinfo, o alguna biblioteca lo hará por usted.

1

Dependiendo de su sabor de Linux obtendrá diferentes resultados de/proc/cpuid.

Esto funciona para mí en CentOS para obtener el número total de núcleos.

cat /proc/cpuinfo | grep -w cores | sed -e 's/\t//g' | awk '{print $3}' | xargs | sed -e 's/\ /+/g' | bc 

Lo mismo no funciona en Ubuntu. Para Ubuntu puedes usar el siguiente comando.

nproc 
+0

Uso inútil de 'cat'. Lo siguiente funcionará bien: 'grep -m1" núcleos "/ proc/cpuinfo | tr -d '[a-z]: [: espacio:]' ' – Yokai

4

Usted puede utilizar esto para casi todo tipo de distribución Linux

Para el código C

num_cpus = sysconf(_SC_NPROCESSORS_ONLN); 

(En los sistemas de QNX, puede utilizar num_cpus = sysinfo_numcpu())

Por shell scripting, puede usar cat /proc/cpuinfo

o use lscpu o nproc comandos en linux

+1

esta es la forma más' programática ', posiblemente la más simple; aunque man sysconf() especifica que el valor "puede no ser estándar" – Mark

+0

Para las personas que vinieron aquí en busca de ayuda con QNX, no existe tal método en la base qnx660 como sysinfo_numcpu() – rasjani

Cuestiones relacionadas