Аватар для Unit_39
12 / 12 / 9
Регистрация: 16.05.2011
Сообщений: 109

Как получить модель процессора

05.10.2015, 14:06. Показов 5093. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Мне нужно получить модель процессора в виде ( к примеру) : Intel Core 2 Quad Q9330 2.5 GHz
Но только так, чтобы это работало под Linux/Windows

Я пробовал через /proc/cpuinfo, получилось, но для win Это не пойдет.
И пробовал libcpuid, но там у меня не вышло собрать проект, он все ругался на conflict declaration, пробовал менять исходники, но не вышло
Еще пробовал через intrin.h, но какой из intrint-ов подключить я, честно говоря не знаю

Вообще я в растерянности, прошу помощи у Вас!
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.10.2015, 14:06
Ответы с готовыми решениями:

Как получить температуру процессора?
Как получить температуру процессора?

Как получить модель материнской платы?
Доброе время суток! Подскажите пожалуйста как в c# получить модель материнской платы?

Регистровая модель процессора
Помогите пожалуйста Какой регистр специального назначения служит для сохранения признаков и бит управления? 1)EELAGS 2)IP ...

7
 Аватар для HighPredator
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
05.10.2015, 14:41
Лучший ответ Сообщение было отмечено Unit_39 как решение

Решение

Универсального способа нет и не может быть, т.к. апи разное. Для подобия универсальности нужно будет делать что-то типа:
C
1
2
3
4
5
6
7
8
char* GetCPUModel(void)
{
#ifdef _WINDOWS_
  /* windows code */
#elif _LINUX_
  /* linux code */
#endif
}
2
 Аватар для Unit_39
12 / 12 / 9
Регистрация: 16.05.2011
Сообщений: 109
06.10.2015, 15:36  [ТС]
HighPredator,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
void getCPUInfo()
{
 
#ifdef _WIN32
 
   #include <intrin.h>
 
   // Get extended ids.
   int CPUInfo[4] = {-1};
   __cpuid(CPUInfo, 0x80000000);
   unsigned int nExIds = CPUInfo[0];
 
   // Get the information associated with each extended ID.
   char CPUBrandString[0x40] = { 0 };
   for(unsigned int i=0x80000000; i<=nExIds; ++i)
   {
       __cpuid(CPUInfo, i);
 
       // Interpret CPU brand string and cache information.
       if  (i == 0x80000002)
       {
           memcpy( CPUBrandString, CPUInfo, sizeof(CPUInfo));
       }
       else if(i == 0x80000003)
       {
           memcpy( CPUBrandString + 16, CPUInfo, sizeof(CPUInfo));
       }
       else if(i == 0x80000004)
       {
           memcpy(CPUBrandString + 32, CPUInfo, sizeof(CPUInfo));
       }
   }
 
#elif _linux_
 
   #include <string>
   #include <iostream>
   #include <fstream>
   #include <sstream>
 
   std::string line;
   std::ifstream finfo("/proc/cpuinfo");
 
   while(getline(finfo,line))
   {
       std::stringstream str(line);
       std::string itype;
       std::string info;
 
       if (getline( str, itype, ':' ) && getline(str,info) && itype.substr(0,10) == "model name")
       {
          std::cout << "CPU: " << info << std::endl;
          break;
       }
   }
   
#endif
 
}
На Windows еще не проверял, а на Ubuntu не работает. Может быть дело в макросах?
0
599 / 421 / 137
Регистрация: 02.10.2008
Сообщений: 1,798
Записей в блоге: 1
06.10.2015, 18:40
Накидал на скору руку на тему /proc/cpuinfo
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
 
int main()
{
    FILE *hand;
    char     outstr[FILENAME_MAX], *tmp;
    
    outstr[FILENAME_MAX-1]=0;
    hand=popen("cat /proc/cpuinfo | grep name","r");
    
    if(hand==NULL)
        {perror("Can`t open shell process:");
         return -1;
        }
 
   fgets(outstr,FILENAME_MAX-1,hand);
   
   tmp=strchr(outstr,':');
   if(tmp == NULL)
   {puts("Damn, format /proc/cpuinfo unrecognized");
   fclose(hand);
   return -2;}
   
   tmp++;
 
   if(tmp == NULL)
   {puts("Damn, format /proc/cpuinfo unrecognized");
   fclose(hand);
   return -2;}
 
   tmp++;
 
   if(tmp == NULL)
   {puts("Damn, format /proc/cpuinfo unrecognized");
   fclose(hand);
   return -2;}
 
   
   puts(tmp);
   
   fclose(hand);
 return 0;
}
проверил:
Bash
1
2
3
4
5
6
[faust@localhost C]$ uname -a
Linux localhost 4.2.2-1-ARCH #1 SMP PREEMPT Tue Sep 29 22:21:33 CEST 2015 x86_64 GNU/Linux
[faust@localhost C]$ ./a.out
AMD Athlon(tm) II X3 450 Processor
 
[faust@localhost C]$
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
06.10.2015, 22:50
Коль скоро будет чисто linux-зависимая часть, то для потрошения /proc/cpuinfo можно воспользоваться функцией getdelim (на примере кода с http://stackoverflow.com/quest... r-of-cores, но более корректно)

C
#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, '\n', cpuinfo) != -1)
   {
      printf("%s", arg);
   }
   free(arg);
   fclose(cpuinfo);
   return 0;
}
Далее выделяем строку с началом "model name" и через strchr находим остаток по символу ':'. Но надо иметь в виду, что на многоядерном процессоре всё будет выглядеть так, как будто на машине установлено несколько процессоров. Если на машине установлено два четырёхядерных процессора, то номинально в выдаче будет 8 процессоров. Фиг знает, как по культурному отсекать дальше, в теории можно по полю "cpu cores". Есть исходники утилиты lscpu, которая умеет писать количество процессоров и количество ядер на каждом из процессоров: http://code.metager.de/source/... ls/lscpu.c

Но при этом надо иметь в виду, что вся эта технология подвешена на больших соплях. Сегодня она работает, а завтра может и не работать. Вот так, например, выглядит содержимое /proc/cpuinfo на машине sparc-linux (т.е. все вышеприведённые коды тупо не будут работать):

Code
cpu             : TI UltraSparc III+ (Cheetah+)
fpu             : UltraSparc III+ integrated FPU
pmu             : ultra3+
prom            : OBP 4.10.11 2003/09/25 11:53
type            : sun4u
ncpus probed    : 1
ncpus active    : 1
D$ parity tl1   : 0
I$ parity tl1   : 0
cpucaps         : flush,stbar,swap,muldiv,v9,ultra3,mul32,div32,v8plus,vis,vis2
Cpu0ClkTck      : 000000003c7fabc0
MMU Type        : Cheetah+
MMU PGSZs       : 8K,64K,512K,4MB
State:
CPU0:           online
Т.е. вышеописанные реализации - они по смыслу касаются только intel-linux, да и то наверное в некотором диапазоне версий ядра
2
 Аватар для Unit_39
12 / 12 / 9
Регистрация: 16.05.2011
Сообщений: 109
07.10.2015, 15:45  [ТС]
Okay, а мой то вариант почему не работает?
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
07.10.2015, 15:54
Цитата Сообщение от Unit_39 Посмотреть сообщение
Okay, а мой то вариант почему не работает?
Если ты сам не можешь разобраться с тем, почему твой код не работает, тогда сиди и жди тех, кому будет не впадлу с твоим кодом разбираться. Хотя для разнообразия можешь попробовать сам взять и разобраться (например, под отладчиком запустить)
1
0 / 0 / 0
Регистрация: 16.10.2015
Сообщений: 6
16.10.2015, 05:56
Ребять, все гораздо проще, есть стандартная команда на любом процессоре, на асме она называется CPUID, на асме получается так:

Assembler
1
2
3
4
5
6
7
  asm                //asm call to the CPUID inst.  
    mov eax,0         //sub. func call  
    db $0F,$A2         //db $0F,$A2 = CPUID instruction  
    mov _ebx,ebx
     mov _ecx,ecx
     mov _edx,edx
   end;
в инете кругом есть опписание ответа от проца, там возвращается все, при запросе mov eax,0
от поддержки инструкций проца.

Вот ее результат
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
CPU=
   - Vendor ID: =GenuineIntel
   - Stepping ID: =1
   - Model Number: =5
   - Family Code: =6
   - Processor Type: =0
   - Extended Model: =4
   - Extended Family: =0
   - Brand ID: =0
   - Chunks: =8
   - Count: =16
   - APIC ID: =1
   - Serial Number =Disabled
   - Serial Number: =0004-0651-0000-0000-0000-0000
=
MMX =Supported
FXSAVE & FXRSTOR Instructions =Supported
SSE =Supported
SSE2 =Supported
=
Extended CPUID: =Supported
   - Largest Function Supported: =8
Brand String: =
=   - Intel(R) Core(TM) i5-4200U CPU @ 1.60GHz
есть код на delphi, но думаю проблем теперь не возникнет написать кроссплатформеный получатель
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.10.2015, 05:56
Помогаю со студенческими работами здесь

Как получить серийный номер процессора и MAC адрес компьютера?
Нужен пример кода, который выведет серийный номер процессора и мак адрес

Определить модель процессора, используя команду cpuid
Определить модель процессора, используя команду cpuid. Используя RegOpenKey, RegQueryValueEx, RegCloseKey, определить название...

Надо определить семейство, модель и модификацию процессора
помогите определить семейство, модель и модификацию процессора, где здесть что конкретно?

Создать bat'ник, определяющий модель процессора
Создать командный файл, при вызове которого указывается модель процессора семейства Intel Pentium (I, II, III, IV). Каждой такой модели...

Разработать последовательность микрокоманд в программе «Модель процессора»
Разработать последовательность микрокоманд, выполняющую заданные машинные команды. В программе «Модель процессора» 1. mov AX, const...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

Новые блоги и статьи
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru