2011-01-03 14 views
38

Linuxで利用できるCPU数を取得するAPIはありますか? 私はsched.hを使用して、この実装を見つけた CでLinuxのCPU数を取得

.../procの/ cpuinfoのまたは任意の他のsys-ノードのファイルを使用せずに、意味:

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年間に見たLinuxのすべての箱には、カーネルが知っているものと常に最新のものがあり、既存のもののフォーマットはあまり変わっていません。 – 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

プラス:Mac OSXで動作します。 –

+1

良い解決策ですが、POSIXのLinux拡張のようです:http://pubs.opengroup.org/onlinepubs/9699919799/functions/sysconf.html –

+1

Plus:Cygwinで動作します – zhangyoufu

15

/proc/cpuinfoを使用することは、最もクリーンで最もポータブルなソリューションです。オープンに失敗した場合は、単純に1CPUまたは2CPUと仮定することができます。マイクロ最適化以外の目的(例えば、実行するスレッドの理想的な数を選択するなど)のためにcpusの数を知ることに依存するコードは、ほぼ確実に何かばかげたことをしています。

_SC_NPROCESSORS_ONLNソリューションは、(のglibc固有)よりもはるかに大きい依存性があるsysconf延長、非標準に依存/proc(すべてのLinuxシステムが/procを持っているが、いくつかは、非のglibc libcs​​または欠けているのglibcの古いバージョンを持っています_SC_NPROCESSORS_ONLN)。

+11

+1 OPは自分自身をぶら下げているように思っていたので、私はただ彼にロープを与えた。 – chrisaycock

+3

Ulrich Drepperがロープをくれたと思う。私は本当に同じようなことをするための既存の、はるかにクリーンではるかに移植可能な方法があるときに、このような非標準的なものを追加する動機を理解していません。 (プログラムに '_SC_NPROCESSORS_ONLN'を書くと、定数がなくてもコンパイルが失敗しますが、他の方法は実行時に失敗します(' open'など)、正常なコードは失敗条件を処理します。 –

+8

どのように/ proc/cpuinfoは移植可能ですか?これはLinux特有のインタフェースです(例えば、/ procにlinprocfsファイルシステムをマウントしたFreeBSDのような他のシステムもそれをエミュレートします)。たとえば、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; 
} 
関連する問題