![]() |
|
Модераторы: xvr |
![]()
|
|
| KaraKum |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 640 Регистрация: 3.12.2007 Репутация: нет Всего: 1 |
Доброе время суток.
Есть программа на C++, написанная изначально с обширным использованием WinAPI (потоки, мьютексы, получение информации о железе...) - нужно её портировать под Linux, FreeBSD (*BSD), Solaris, MacOS, Minix... Насколько я знаю, все эти ОС-ы являются продолжениями Unix'а. Будет ли программа компилироваться под этими ОС-и, если портировать под Unix? Где можно найти полный "API-reference" по Unix? (желательно для "мигрирущующих" с Windows'а). P.S. портирование подразумевается прямо в коде с использованием #ifdef/#else/#endif..., а не подключением библиотек, абстрагирующих ОС (posix thread's под Windows, например). Это сообщение отредактировал(а) KaraKum - 10.1.2011, 20:17 |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 16 Всего: 110 |
только тот код, который не использует WinAPI. man + google
сочувствую большинство WinAPI можете найти в wine-dev. такой способ тоже работает. |
|||
|
||||
| KaraKum |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 640 Регистрация: 3.12.2007 Репутация: нет Всего: 1 |
Это очевидно. Бросаю кость для поиска средств получения информации о железе.
В *nix'е должны использоваться её родные средства - так будто программа была написана для этой ОС (так и есть, но по воле случая первым попался под-руку именно Windows). |
|||
|
||||
| Фантом |
|
|||
![]() Вы это прекратите! ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1516 Регистрация: 23.3.2008 Репутация: 1 Всего: 49 |
Под все сразу? Если всерьез, то вариантов два. Если программа непосредственно и всерьез не связана с железом, то сначала аккуратно переписать все под Windows, избавившись от прямой работы с API. Если связана и от использования API никуда не деться - писать ее функциональный аналог заново, не трогая старый код. Оба варианта почти наверняка обойдутся дешевле, чем попытка переноса "в лоб". |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 16 Всего: 110 |
значит переписать полностью, используя кросс-либы. иных(здравых) вариантов нет. |
|||
|
||||
| KaraKum |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 640 Регистрация: 3.12.2007 Репутация: нет Всего: 1 |
Там кусочками - например такое место: идёт общение клиента с сервером посредством кроссплатформенной библиотеки (ENet) и в один "прекрасный" момент клиент должен передать информацию о своей сетевой карте (MAC-адрес, имя...) и о процессоре (cpuid()) - в Windows'е это где-то 100-150 строк обособленного кода (в конце имеется std::string для каждого этого данного - поэтому такое без проблем можно обернуть в #ifdef/#elif/#endif..., но вот в unix programming reference о железе вообще ничего нету
P.S. вот потоки есть (POSIX threads) - это, вроде как, стандарт - с этим проблем не должно возникнуть во всех Unix-подобных ОС. Добавлено через 35 секунд
Откуда такое умозаключение? |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 16 Всего: 110 |
изначально отсюда: т.к. я подумал что программа содержит тысячи строк вендового кода. но, как стало известно позже, вам требуются: cpuid + опции_сети + потоки. тогда не понятно, почему тема тут? в гугле есть абсолютно все. зы от скуки наверное. |
|||
|
||||
| KaraKum |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 640 Регистрация: 3.12.2007 Репутация: нет Всего: 1 |
про железо в Unix'е ничего нет. тогда странно что нет ответа вот с такой ссылкой Это сообщение отредактировал(а) KaraKum - 10.1.2011, 14:11 |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 16 Всего: 110 |
cpuid: http://www.google.ru/#hl=ru&expIds=172...4db31426aee1aa2
mac address: http://www.google.ru/#hl=ru&expIds=172...4db31426aee1aa2 остальное оффтоп. |
|||
|
||||
| KaraKum |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 640 Регистрация: 3.12.2007 Репутация: нет Всего: 1 |
Вот информацию о процессорах получить неизвестно как. cpuid() для этого может быть недостаточно - эта команда возвращает только информацию о том процессоре, на котором эта команда вызывается, а на некоторых системах может быть больше одного процессора.
В Unix-спецификации такого что-то нет, хотя должно же быть - Unix ведь как-то определяет сколько процессоров есть в система (чтобы распределять потоки). |
|||
|
||||
| panter |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 10.1.2011 Где: Санкт-Петербург Репутация: нет Всего: нет |
cat /proc/cpuinfo и парсить вывод.
|
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 16 Всего: 110 |
ну хз.. точнее может MAKCim сказать.
|
|||
|
||||
| KaraKum |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 640 Регистрация: 3.12.2007 Репутация: нет Всего: 1 |
А как можно напрямую воспользоваться теми же средствами, которыми был сформирован этот файл? Это сообщение отредактировал(а) KaraKum - 10.1.2011, 14:40 |
|||
|
||||
| panter |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 10.1.2011 Где: Санкт-Петербург Репутация: нет Всего: нет |
||||
|
||||
| KaraKum |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 640 Регистрация: 3.12.2007 Репутация: нет Всего: 1 |
Спасибо за ответ и прямую ссылку! Нужна информация по всем процессорам в системе. cpuid возвращает информацию только о том процессоре, на котором эта команда была вызвана, а нужна информация (тактовая частота) по всем процессорам в системе (это может быть многопроцессорный сервер или, например, два процессора на одной мат. плате). |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 16 Всего: 110 |
||||
|
||||
| KaraKum |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 640 Регистрация: 3.12.2007 Репутация: нет Всего: 1 |
Такой функции я тоже не встречал. Получить информацию о тактовой частоте каждого процессора можно с помощью функции CallNtPowerInformation(). Добавлено @ 15:50
Добавлено через 6 минут и 36 секунд Вот этот код, в принципе, можно было бы обернуть в #ifdef WINDOWS/#elif UNIX/#endif... и можно парсить системный файл, но как-то это примитивно и неправильно... Это сообщение отредактировал(а) KaraKum - 10.1.2011, 15:53 |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 16 Всего: 110 |
т.е. вам не нравится в линухе cpuid из-за того что невозможно указать о каком процессоре получить информацию. в то же время, оказывается, что это невозможно и в вендаусе зы а код порадовал. особенно хранение в с++ контейнере сырых указателей. а выделение памяти двумя способами(malloc() и new[]) - так это вообще загадка это код не портировать нужно, а переписывать. Это сообщение отредактировал(а) boostcoder - 10.1.2011, 16:05 |
|||
|
||||
| KaraKum |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 640 Регистрация: 3.12.2007 Репутация: нет Всего: 1 |
Эмм, я говорил что обо ВСЕХ процессорах нужна информация о тактовой частоте. cpuid - это другая информация о процессоре (марка, модель, брэнд...) - тактовую частоту там даже нельзя получить. cpuid() работает и в линуксе и в виндовсе (и портировать не нужно).
Это не ко мне, а к ребятам из Microsoft'а. Добавлено через 1 минуту и 11 секунд А к коду претензий нет - всё-таки его нужно портировать, а не переписывать. |
||||
|
|||||
| Любитель |
|
|||
|
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: нет Всего: 92 |
Честно - не проверял (ибо лень), но вообще самое высокоуровневое АПИ - это по идее WMI. Выбираем всё по "select * from Win32_Processor" и используем кучу полей: http://msdn.microsoft.com/en-us/library/aa...v=vs.85%29.aspx (там примеры на VBScript, на С++ побольше кода уйдёт на инициализацию COM, запрос нужных провайдеров и пр., но суть таж). |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 16 Всего: 110 |
WMI - это не совсем WinAPI, мне так кажется.. Добавлено через 6 минут и 34 секунды в добавок: http://stackoverflow.com/questions/2418921...peed-in-c-linux |
|||
|
||||
| KaraKum |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 640 Регистрация: 3.12.2007 Репутация: нет Всего: 1 |
Странно это как-то - парсить файлы, сгенерированные операционной системой. Ненужный посредник возникает...
Хотя ничего страшного - это всё-равно требуется сделать только один раз - при запуске программы. Про "adapter info" (имя сетевой карты ("Realtek JBC 5460 ...")) не ясно |
|||
|
||||
| cutwater |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 592 Регистрация: 24.6.2008 Репутация: нет Всего: 10 |
||||
|
||||
| KaraKum |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 640 Регистрация: 3.12.2007 Репутация: нет Всего: 1 |
А вот всё что связано с этими файлами - это конкретно нововведение в Linux'е? Или ещё Unix'а?
Как вообще это посредничество в виде файлов называется? Наверное там и про адаптеры (сетевые карты) что-нибудь вычитать (распарсить) можно... |
|||
|
||||
| panter |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 10.1.2011 Где: Санкт-Петербург Репутация: нет Всего: нет |
Unix, на сколько я знаю. Кстати, это не совсем файлы. Там много чего можно найти.
|
|||
|
||||
| cutwater |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 592 Регистрация: 24.6.2008 Репутация: нет Всего: 10 |
http://ru.wikipedia.org/wiki/Procfs |
|||
|
||||
| KaraKum |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 640 Регистрация: 3.12.2007 Репутация: нет Всего: 1 |
Вот это огорчает. А мне говорили что FreeBSD может запускать бинарники Linux'а. Походу ошибались... А как можно узнать в Unix'е имя операционной системы? |
|||
|
||||
| fish9370 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 15.4.2007 Где: Москва Репутация: 2 Всего: 1 |
man 2 uname
-------------------- undefined |
|||
|
||||
| KaraKum |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 640 Регистрация: 3.12.2007 Репутация: нет Всего: 1 |
Спасибо за функцию!
Из статьи про procfs:
Чем тогда они в будущем будут заменены во FreeBSD? (или заменены сейчас, раз ликвидируются постепенно?) |
|||
|
||||
| fish9370 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 15.4.2007 Где: Москва Репутация: 2 Всего: 1 |
sysfs (/sys) - это еще одно представление информации о железе через файловую систему, но хоронить procfs я бы пока не стал.. -------------------- undefined |
|||
|
||||
![]()
|
| Правила форума "С/С++: Программирование под Unix/Linux" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |