2011-01-03 27 views
38

¿Hay una API para obtener la cantidad de CPU disponibles en Linux? quiero decir, sin utilizar/proc/cpuinfo o cualquier otro archivo sys-nodo ...Obtenga el número de CPU en Linux utilizando C

que he encontrado esta aplicación utilizando sched.h:

int GetCPUCount() 
{ 
cpu_set_t cs; 
CPU_ZERO(&cs); 
sched_getaffinity(0, sizeof(cs), &cs); 

int count = 0; 
for (int i = 0; i < 8; i++) 
{ 
    if (CPU_ISSET(i, &cs)) 
    count++; 
} 
return count; 
} 

Pero, no hay nada más nivel superior utilizando bibliotecas comunes?

+22

¿Por qué la gente está tan asustado utilizar/proc? Cada caja de Linux que he visto en los últimos 15 años lo tiene, siempre está actualizada con lo que sabe el kernel, y el formato de las cosas existentes en él no cambia mucho. – cHao

+1

Creo que es genial que intentes aprender diferentes formas de hacer las cosas, pero ¿estás tratando de reinventar la rueda? – Davidann

+0

posible duplicado de [¿Cómo puedo recuperar la cantidad de procesadores en C/Linux?] (Http://stackoverflow.com/questions/2693948/how-do-i-retrieve-the-number-of-processors-on- c-linux) –

Respuesta

2
#include <stdio.h> 
#include <sys/sysinfo.h> 
int 
int main(int argc, char *argv[]) 
{ 
    printf("This system has %d processors configured and " 
     "%d processors available.\n", 
     get_nprocs_conf(), get_nprocs()); 
    return 0; 
} 

https://linux.die.net/man/3/get_nprocs

65
#include <unistd.h> 
sysconf(_SC_NPROCESSORS_ONLN); 
+1

Plus: funciona en Mac OSX. –

+1

Buena solución, pero parece una extensión de Linux para POSIX: http://pubs.opengroup.org/onlinepubs/9699919799/functions/sysconf.html –

+1

Plus: funciona en Cygwin – zhangyoufu

15

El uso de /proc/cpuinfo es la solución más limpia y portátil. En caso de que la apertura falla, simplemente podría asumir 1 CPU o 2 CPU. El código que depende de conocer el número de CPU para un fin diferente a la optimización de micro (por ejemplo, elegir el número ideal de hilos para ejecutar) es casi seguro que está haciendo algo tonto.

La solución _SC_NPROCESSORS_ONLN depende de un no-estándar (glibc-específico) sysconf extensión, que es una dependencia mucho más grande que /proc (todos los sistemas Linux tienen /proc, pero algunos tienen libcs ​​no glibc o versiones anteriores de glibc que carecen _SC_NPROCESSORS_ONLN).

+11

+1 OP parecía decidido a ahorcarse, así que le di la cuerda. – chrisaycock

+3

Creo que Ulrich Drepper le dio la cuerda. Realmente no entiendo la motivación para agregar cosas no estándar como esta cuando hay una forma existente, mucho más limpia y mucho más portátil de hacer lo mismo. (Si escribe '_SC_NPROCESSORS_ONLN' en su programa, no compilará si falta la constante, pero las otras formas simplemente fallarán en el tiempo de ejecución (error 'abierto', etc.) y cualquier código en su sano juicio manejaría la condición de falla). –

+8

¿De qué manera es/proc/cpuinfo portable? Esta es una interfaz específica de Linux (algunos otros sistemas la emulan, por ejemplo, FreeBSD con el sistema de archivos linprocfs montado en/proc).el sysconfig _SC_NPROCESSORS_ONLN, por ejemplo, es compatible con FreeBSD. – MarkR

14

Este código (extraído de here) debería funcionar tanto en plataformas Windows como * NIX.

#ifdef _WIN32 
#define WIN32_LEAN_AND_MEAN 
#include <windows.h> 
#else 
#include <unistd.h> 
#endif 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <errno.h> 


int main() { 
    long nprocs = -1; 
    long nprocs_max = -1; 
#ifdef _WIN32 
#ifndef _SC_NPROCESSORS_ONLN 
SYSTEM_INFO info; 
GetSystemInfo(&info); 
#define sysconf(a) info.dwNumberOfProcessors 
#define _SC_NPROCESSORS_ONLN 
#endif 
#endif 
#ifdef _SC_NPROCESSORS_ONLN 
    nprocs = sysconf(_SC_NPROCESSORS_ONLN); 
    if (nprocs < 1) 
    { 
    fprintf(stderr, "Could not determine number of CPUs online:\n%s\n", 
strerror (errno)); 
    exit (EXIT_FAILURE); 
    } 
    nprocs_max = sysconf(_SC_NPROCESSORS_CONF); 
    if (nprocs_max < 1) 
    { 
    fprintf(stderr, "Could not determine number of CPUs configured:\n%s\n", 
strerror (errno)); 
    exit (EXIT_FAILURE); 
    } 
    printf ("%ld of %ld processors online\n",nprocs, nprocs_max); 
    exit (EXIT_SUCCESS); 
#else 
    fprintf(stderr, "Could not determine number of CPUs"); 
    exit (EXIT_FAILURE); 
#endif 
} 
+0

Recibí este código hace mucho tiempo de alguien (no recuerdo el nombre). –

+2

No estoy seguro de que publicar este fragmento de código realmente responda a la pregunta del OP, aunque podrían realizar una ingeniería inversa con información útil. – MarkR

+1

Estoy de acuerdo con MarkR. chrisaycock proporciona una respuesta sucinta. – poindexter

9

sched_affinity() versión se menciona en el principio sigue siendo mejor que /proc/cpuinfo y/o _SC_NPROCESSORS_ONLN ya que sólo cuenta CPU disponibles para un proceso dado (algunos pueden ser desactivado por sched_setaffinity() invocado por un proceso externo). El único cambio sería usar CPU_COUNT() en lugar de hacer CPU_ISSET en un bucle.

0

Otro método de exploración de la CPU * directorios del sistema de archivos sys:

#include<stdio.h> 
#include <dirent.h> 
#include <errno.h> 
#define LINUX_SYS_CPU_DIRECTORY "/sys/devices/system/cpu" 

int main() { 
    int cpu_count = 0; 
    DIR *sys_cpu_dir = opendir(LINUX_SYS_CPU_DIRECTORY); 
    if (sys_cpu_dir == NULL) { 
     int err = errno; 
     printf("Cannot open %s directory, error (%d).\n", LINUX_SYS_CPU_DIRECTORY, strerror(err)); 
     return -1; 
    } 
    const struct dirent *cpu_dir; 
    while((cpu_dir = readdir(sys_cpu_dir)) != NULL) { 
     if (fnmatch("cpu[0-9]*", cpu_dir->d_name, 0) != 0) 
     { 
      /* Skip the file which does not represent a CPU */ 
      continue; 
     } 
     cpu_count++; 
    } 
    printf("CPU count: %d\n", cpu_count); 
    return 0; 
} 
Cuestiones relacionadas