2011-01-03 1 views
38

Linux에서 사용할 수있는 CPU 수를 얻을 수있는 API가 있습니까? 나는,/proc 디렉토리/cpuinfo의 또는 기타 SYS-노드 파일 ...C를 사용하여 Linux에서 CPU 수 얻기

를 사용하지 않고 나는 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

왜 사람들은/proc 디렉토리를 사용하는 것이 그렇게 두려워? 지난 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

좋은 해결책이지만, POSIX의 리눅스 확장 기능처럼 보입니다. http://pubs.opengroup.org/onlinepubs/9699919799/functions/sysconf.html –

+1

Plus : Cygwin에서 작동합니다. – zhangyoufu

15

/proc/cpuinfo을 사용하면 가장 깨끗하고 휴대 성이 뛰어난 솔루션입니다. 오픈이 실패 할 경우, 1 cpu 또는 2 cpus라고 간단히 추측 할 수 있습니다. 마이크로 최적화 이외의 목적으로 CPU의 수를 아는 것에 의존하는 코드 (예 : 이상적인 스레드 수를 선택하는 것)는 거의 확실하게 무언가를하고 있습니다.

_SC_NPROCESSORS_ONLN 솔루션 (glibc가 특정)보다 훨씬 더 큰 의존성이 sysconf 확장, 비 - 표준에 따라 /proc (모든 리눅스 시스템 /proc을 가지고 있지만, 일부는 비의 glibc libcs ​​또는 부족의 glibc의 이전 버전을 _SC_NPROCESSORS_ONLN).

+11

+1 OP는 자신을 교수형에 처하는 것처럼 보였으므로 나는 그에게 로프를주었습니다. – chrisaycock

+3

Ulrich Drepper가 그에게 로프를 주었다고 생각합니다. 나는 똑같은 일을하는 기존의 훨씬 더 깔끔하고 훨씬 더 이식 가능한 방법이있을 때 이와 같은 비표준적인 것들을 추가하려는 동기를 정말로 이해하지 못합니다. (프로그램에'_SC_NPROCESSORS_ONLN'을 쓰면, 상수가 누락되면 컴파일이 실패하지만, 다른 방법은 런타임에 실패 ('open' 실패 등)하고 정상적인 코드는 실패 조건을 처리합니다.) –

+8

/proc/cpuinfo는 어떤 식으로 휴대용입니까? 이것은 Linux 전용 인터페이스입니다 (예 : Linprocfs 파일 시스템이있는 FreeBSD는/proc에 마운트 됨).예를 들어 sysconfig _SC_NPROCESSORS_ONLN은 FreeBSD에서 지원됩니다. – MarkR

14

이 코드 (here에서 가져옴)는 Windows와 * NIX 플랫폼 모두에서 작동해야합니다. 그것은 단지 주어진 프로세스에 사용 가능한 CPU를 계산하기 때문에 당신이 처음에 언급

#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_ISSET을 수행하는 대신 CPU_COUNT()을 사용하는 것입니다.

0

또 다른 방법 스캔 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; 
}