2012-03-09 26 views
6

क्या /proc/cpuinfo को पार्स करने के बजाए कुछ एपीआई या फ़ंक्शन द्वारा ऐसी जानकारी प्राप्त करना संभव है?लिनक्स पर सी में सीपीयू जानकारी कैसे प्राप्त करें, जैसे कि कोर की संख्या?

+0

के संभावित डुप्लिकेट [मैं सी/लिनक्स पर प्रोसेसर की संख्या कैसे प्राप्त करूं?] (Http://stackoverflow.com/questions/2693948/how-do-i-retrieve-the- संख्या-के-प्रोसेसर-ऑन-सी-लिनक्स) –

उत्तर

7

man 5 proc से:

/proc/cpuinfo 
      This is a collection of CPU and system architecture dependent 
      items, for each supported architecture a different list. Two 
      common entries are processor which gives CPU number and 
      bogomips; a system constant that is calculated during kernel 
      initialization. SMP machines have information for each CPU. 

यहाँ नमूना कोड है कि पढ़ता है और सांत्वना देने की जानकारी, stolen from forums प्रिंट है - यह वास्तव में सिर्फ एक विशेष cat आदेश है।

#define _GNU_SOURCE 
#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char **argv) 
{ 
    FILE *cpuinfo = fopen("/proc/cpuinfo", "rb"); 
    char *arg = 0; 
    size_t size = 0; 
    while(getdelim(&arg, &size, 0, cpuinfo) != -1) 
    { 
     puts(arg); 
    } 
    free(arg); 
    fclose(cpuinfo); 
    return 0; 
} 

कृपया ध्यान दें कि आप पार्स और physical id, core id और cpu cores एक सटीक परिणाम प्राप्त करने की तुलना करने, यदि आप वास्तव में बनाम सीपीयू कोर CPUs की संख्या के बारे में परवाह की जरूरत है। कृपया ध्यान दें कि अगर httflags में है, तो आप एक हाइपर-थ्रेडिंग सीपीयू चला रहे हैं, जिसका अर्थ है कि आपका माइलेज भिन्न हो सकता है।

कृपया यह भी ध्यान दें कि यदि आप वर्चुअल मशीन में अपना कर्नेल चलाते हैं, तो आप केवल वीएम अतिथि को समर्पित सीपीयू कोर देखते हैं।

+0

उत्सुक प्रश्न। इस फ़ाइल को कौन अपडेट करता है? – Laz

+1

@ रामबैट - यह सामान्य अर्थ में _file_ नहीं है। विकिपीडिया [procfs के बारे में आलेख] देखें (http://en.wikipedia.org/wiki/Procfs) – Kimvais

+0

मुझे यह आलेख बहुत उपयोगी लगता है,/proc/cpuinfo फ़ाइल को समझने के संदर्भ में - http: //www.richweb। com/cpu_info – warunapww

4

पढ़ें /proc/cpuinfo

नमूना आउटपुट

processor : 0 
model name : Intel(R) Xeon(R) CPU   E5410 @ 2.33GHz 
cache size : 6144 KB 
physical id : 0 
siblings : 4 
core id  : 0 
cpu cores : 4 
processor : 1 
model name : Intel(R) Xeon(R) CPU   E5410 @ 2.33GHz 
cache size : 6144 KB 
physical id : 0 
siblings : 4 
core id  : 1 
cpu cores : 4 
processor : 2 
model name : Intel(R) Xeon(R) CPU   E5410 @ 2.33GHz 
cache size : 6144 KB 
physical id : 0 
siblings : 4 
core id  : 2 
cpu cores : 4 
processor : 3 
model name : Intel(R) Xeon(R) CPU   E5410 @ 2.33GHz 
cache size : 6144 KB 
physical id : 0 
siblings : 4 
core id  : 3 
cpu cores : 4 

show_cpuinfo समारोह जो वास्तव में /proc/cpuinfo कार्यक्षमता लागू करता

1

पार्स फ़ाइल/proc/cpuinfo है। यह आपको सीपीयू के बारे में बहुत सारी जानकारी देगा। प्रासंगिक फ़ील्ड को अपनी सी/सी ++ फ़ाइल में निकालें।

0

क्या आपने कभी इस शेल कमांड "बिल्ली/proc/cpuinfo" के आउटपुट को देखा है? मुझे लगता है कि आपको वहां की सारी जानकारी मिल सकती है। सी प्रोग्राम में जानकारी को पढ़ने के लिए मैं फ़ाइल मैनिपुलेशन फ़ंक्शंस जैसे फॉपेन, फ़ेट्स और अन्य पसंद करूंगा।

3

libcpuid एक साधारण एपीआई प्रदान करता है जो कोर की संख्या सहित सभी सीपीयू सुविधाओं को सीधे वापस कर देगा। कार्यावधि में कोर की संख्या पाने के लिए आपको कुछ इस तरह कर सकता है: अपने स्रोत कोड में

#include <stdio.h> 
#include <libcpuid.h> 

int main(void) 
{ 
    if (!cpuid_present()) { 
     printf("Sorry, your CPU doesn't support CPUID!\n"); 
     return -1; 
    } 

    struct cpu_raw_data_t raw; 
    struct cpu_id_t data;  

    if (cpuid_get_raw_data(&raw) < 0) { 
     printf("Sorry, cannot get the CPUID raw data.\n"); 
     printf("Error: %s\n", cpuid_error()); 
     return -2; 
    } 

    if (cpu_identify(&raw, &data) < 0) {  
     printf("Sorrry, CPU identification failed.\n"); 
     printf("Error: %s\n", cpuid_error()); 
     return -3; 
    } 

    printf("Processor has %d physical cores\n", data.num_cores); 
    return 0; 
} 
+0

लाइब्रेरी ने मेरे लिनक्स बॉक्स पर आउट-ऑफ-द-बॉक्स संकलित नहीं किया था। – Kimvais

+1

@ किमवाइस: मैं बस इतना कह सकता हूं कि यह मेरे लिए काम करता है। – talonmies

+0

हां, वास्तव में समस्या निवारण नहीं किया गया था, बस 'कॉन्फ़िगर करें && && sudo इंस्टॉल करें' और असफल हो गया है, कुछ सचमुच सरल हो सकता है :) – Kimvais

1

जोड़ें निम्नलिखित लाइन ..

system("cat /proc/cpuinfo | grep processor | wc -l"); 

यह आपके सिस्टम में CPUs की संख्या प्रिंट होगा। और यदि आप इस सिस्टम के इस आउटपुट का उपयोग अपने प्रोग्राम में पॉपन सिस्टम कॉल का उपयोग करने के बजाय करना चाहते हैं।

+0

नहीं, यह नहीं है, यह हाइपरथ्रेड भी गिना जाएगा, कृपया पढ़ें - http:/विस्तृत जानकारी डीकोडिंग/proc/cpuinfo फ़ाइल के लिए /www.richweb.com/cpu_info। – warunapww

1

नहीं, यह नहीं है। या तो आपको cpuinfo फ़ाइल को पार्स करना होगा, या कुछ लाइब्रेरी आपके लिए यह करेगी।

1

लिनक्स के आपके स्वाद के आधार पर आपको/proc/cpuid से अलग-अलग परिणाम मिलेंगे।

यह कोरस की कुल संख्या प्राप्त करने के लिए सेंटोस पर मेरे लिए काम करता है।

cat /proc/cpuinfo | grep -w cores | sed -e 's/\t//g' | awk '{print $3}' | xargs | sed -e 's/\ /+/g' | bc 

यह उबंटू में भी काम नहीं करता है। उबंटू के लिए आप निम्न आदेश का उपयोग कर सकते हैं।

nproc 
+0

'बिल्ली' का बेकार उपयोग। निम्नलिखित ठीक काम करेंगे: 'grep-m1 "कोर"/proc/cpuinfo | tr -d '[a-z]: [: space:]' – Yokai

4

आप ज्यादातर linux distro

के सभी प्रकार के लिए इसका उपयोग कर सकते सी कोड

num_cpus = sysconf(_SC_NPROCESSORS_ONLN); 

के लिए (QNX प्रणाली में, आप num_cpus = sysinfo_numcpu() उपयोग कर सकते हैं)

शेल पटकथा लेखन के लिए, आप cat /proc/cpuinfo

का उपयोग कर सकते हैं याका उपयोग कर सकते हैंया nproc लिनक्स

+1

यह सबसे अधिक 'प्रोग्रामेटिकल' है, संभवतः सबसे सरल तरीका; हालांकि मैन sysconf() निर्दिष्ट करता है कि मान "मानक नहीं हो सकता है" – Mark

+0

यहां आने वाले लोगों के लिए QNX के साथ सहायता की तलाश है - बेस qnx660 में sysinfo_numcpu() के रूप में ऐसी कोई विधि नहीं है – rasjani