2011-01-03 25 views
38

Có API nào để lấy số CPU có sẵn trong Linux không? Tôi có nghĩa là, mà không sử dụng/proc/cpuinfo hoặc bất kỳ tập tin sys-nút khác ...Nhận số CPU trong Linux bằng C

tôi đã tìm thấy thi này sử dụng 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; 
} 

Nhưng, không có bất cứ điều gì nhiều hơn mức cao hơn khi sử dụng các thư viện phổ biến?

+22

Tại sao là những người rất ngại sử dụng/proc? Mỗi hộp Linux tôi đã thấy trong 15 năm qua đều có nó, nó luôn được cập nhật với những gì hạt nhân biết, và định dạng của những thứ hiện có trong nó không thay đổi nhiều. – cHao

+1

Tôi nghĩ thật tuyệt khi bạn đang cố gắng học những cách khác nhau để làm việc, nhưng bạn đang cố gắng tái tạo lại bánh xe? – Davidann

+0

bản sao có thể có của [Làm cách nào để truy xuất số bộ xử lý trên C/Linux?] (Http://stackoverflow.com/questions/2693948/how-do-i-retrieve-the-number-of-processors-on- c-linux) –

Trả lời

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: hoạt động trên Mac OSX. –

+1

Giải pháp tốt, nhưng có vẻ như một phần mở rộng của Linux cho POSIX: http://pubs.opengroup.org/onlinepubs/9699919799/functions/sysconf.html –

+1

Plus: hoạt động trên Cygwin – zhangyoufu

15

Sử dụng /proc/cpuinfo là giải pháp sạch và dễ di động nhất. Trong trường hợp mở không thành công, bạn chỉ có thể giả sử 1 CPU hoặc 2 CPU. Mã phụ thuộc vào việc biết số lượng cpus cho một mục đích khác với tối ưu hóa vi mô (ví dụ: chọn số lượng chủ đề lý tưởng để chạy) gần như chắc chắn đang làm một điều gì đó ngu ngốc.

Giải pháp _SC_NPROCESSORS_ONLN phụ thuộc vào một tổ chức phi tiêu chuẩn (glibc-cụ thể) sysconf mở rộng, mà là một sự phụ thuộc lớn hơn nhiều so với /proc (tất cả các hệ thống Linux có /proc, nhưng một số có libcs ​​phi glibc hoặc phiên bản cũ của glibc thiếu _SC_NPROCESSORS_ONLN).

+11

+1 OP dường như kiên quyết về việc treo mình, vì vậy tôi chỉ đưa cho anh sợi dây thừng. – chrisaycock

+3

Tôi nghĩ Ulrich Drepper đã cho anh ta sợi dây thừng. Tôi thực sự không hiểu động cơ để thêm những thứ không chuẩn như thế này khi có một cách hiện có, sạch hơn và nhiều hơn nữa để di động để làm điều tương tự. (Nếu bạn viết '_SC_NPROCESSORS_ONLN' trong chương trình của bạn, nó sẽ không biên dịch nếu hằng số bị thiếu, nhưng các cách khác chỉ thất bại trong thời gian chạy (thất bại' mở', vv) và bất kỳ mã sane nào sẽ xử lý tình trạng lỗi.) –

+8

Theo cách nào là/proc/cpuinfo di động? Đây là một giao diện dành riêng cho Linux (một số hệ thống khác mô phỏng nó, ví dụ, FreeBSD với hệ thống tập tin linprocfs được gắn trong/proc).sysconfig _SC_NPROCESSORS_ONLN chẳng hạn, được hỗ trợ bởi FreeBSD. – MarkR

14

Mã này (được vẽ từ here) sẽ hoạt động trên cả hai cửa sổ và * Nền tảng 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

Tôi nhận được mã này một thời gian dài từ một số (không nhớ tên). –

+2

Tôi không chắc chắn đăng đoạn mã này thực sự trả lời câu hỏi của OP, mặc dù họ có thể đảo ngược kỹ thuật một số thông tin hữu ích từ nó. – MarkR

+1

Tôi đồng ý với MarkR. chrisaycock cung cấp một câu trả lời ngắn gọn. – poindexter

9

sched_affinity() phiên bản bạn đề cập đến trong đầu vẫn còn tốt hơn so với /proc/cpuinfo và/hoặc _SC_NPROCESSORS_ONLN vì nó chỉ đếm CPU có sẵn cho một quá trình nhất định (một số có thể bị vô hiệu hóa bởi sched_setaffinity() gọi bởi một quá trình bên ngoài). Thay đổi duy nhất sẽ sử dụng CPU_COUNT() thay vì thực hiện CPU_ISSET trong một vòng lặp.

0

Một phương pháp quét cpu * thư mục theo hệ thống tập tin 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; 
}