2011-01-03 3 views
38

Есть ли API для получения количества процессоров, доступных в Linux? Я имею в виду, без использования/ргос/CPUInfo или любой другой файл SYS-узел ...Получите количество процессоров в Linux, используя C

Я нашел эту реализацию с помощью 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; 
} 

Но там нет ничего более более высокий уровень с использованием общих библиотек?

+22

Почему люди так боятся использовать/прок? Каждый Linux-модуль, который я видел за последние 15 лет, имеет его, он всегда в курсе того, что знает ядро, и формат существующего в нем материала не сильно меняется. – cHao

+1

Я думаю, это здорово, что вы пытаетесь изучить разные способы делать вещи, но пытаетесь ли вы изобретать колесо? – Davidann

+0

Возможный дубликат [Как получить количество процессоров на C/Linux?] (Http://stackoverflow.com/questions/2693948/how-do-i-retrieve-the-number-of-processors-on- c-linux) –

ответ

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: работает на Mac OSX. –

+1

Хорошее решение, но похоже на расширение Linux для POSIX: http://pubs.opengroup.org/onlinepubs/9699919799/functions/sysconf.html –

+1

Plus: работает на Cygwin – zhangyoufu

15

Использование /proc/cpuinfo является самым чистым и самым портативным решением. В случае сбоя open вы можете просто принять 1 процессор или 2 процессора. Код, который зависит от знания количества процессоров для целей, отличных от микрооптимизации (например, выбор идеального числа потоков для запуска), почти наверняка делает что-то немое.

_SC_NPROCESSORS_ONLN решения зависит от нестандартности (glibc-специфический) sysconf расширения, которое гораздо больше зависимости, чем /proc (все системы Linux имеют /proc, но некоторые из них, не GLibC libcs ​​или более ранних версии Glibc, которые испытывают недостаток _SC_NPROCESSORS_ONLN).

+11

+1 OP выглядел непреклоненным тем, что повесился, поэтому я просто дал ему веревку. – chrisaycock

+3

Я думаю, что Ульрих Дреппер дал ему веревку. Я действительно не понимаю мотивацию добавления нестандартных вещей, подобных этому, когда есть существующий, гораздо более чистый и гораздо более портативный способ сделать то же самое. (Если вы пишете '_SC_NPROCESSORS_ONLN' в своей программе, он не сможет скомпилировать, если константа отсутствует, но другие способы просто выходят из строя во время выполнения (не удалось« открыть »и т. Д.), И любой нормальный код будет обрабатывать условие сбоя.) –

+8

Как переносится/proc/cpuinfo? Это интерфейс, специфичный для Linux (некоторые другие системы имитируют его, например, FreeBSD с файловой системой linprocfs, установленной в/proc).Например, sysconfig _SC_NPROCESSORS_ONLN поддерживается FreeBSD. – MarkR

14

Этот код (нарисованный от here) должен работать как на окнах, так и на платформах 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

Я получил этот код долгое время от кого-то (не помню имя). –

+2

Я не уверен, что этот фрагмент кода действительно отвечает на вопрос OP, хотя они могут перепрограммировать некоторую полезную информацию из него. – MarkR

+1

Я согласен с MarkR. chrisaycock дает краткий ответ. – poindexter

9

sched_affinity() версия вы упоминаете в начале все же лучше, чем /proc/cpuinfo и/или _SC_NPROCESSORS_ONLN, поскольку он рассчитывает только процессоры, доступные для данного процесса (некоторые из них могут быть отключены sched_setaffinity(), вызываемых внешним способом). Единственное изменение будет использовать CPU_COUNT() вместо того, чтобы делать CPU_ISSET в цикле.

0

Другой метод сканирования процессора * каталоги в файловой системе 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; 
} 
Смежные вопросы