Подтвердить что ты не робот

Получите количество процессоров в Linux, используя C

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

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

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

4b9b3361

Ответ 1

#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

Ответ 2

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

Ответ 3

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

Решение _SC_NPROCESSORS_ONLN зависит от нестандартного (glibc-specific) расширения sysconf, которое намного больше, чем /proc (все Linux-системы имеют /proc, но некоторые из них имеют не-glibc libcs или более старые версии glibc, которые не имеют _SC_NPROCESSORS_ONLN).

Ответ 4

Этот код (из здесь) должен работать как на Windows, так и на платформах * 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
}

Ответ 5

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

Ответ 6

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