Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.68/25: Рейтинг темы: голосов - 25, средняя оценка - 4.68
 Аватар для Unit_39
12 / 12 / 9
Регистрация: 16.05.2011
Сообщений: 109

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

05.10.2015, 14:06. Показов 5084. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 30.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru