Получение информации о системе Вашего компьютера Mac
В приложении «Информация о системе» Вы увидите отчет о системе, содержащий подробную информацию о Вашем компьютере Mac, включая следующее.
Оборудование, которое установлено или подключено к нему.
Сетевые подключения компьютера, включая активные службы, их IP-адреса, а также тип и скорость сетевого подключения.
Программное обеспечение компьютера, включая операционную систему, приложения и количество ядер. (Можно просмотреть версии, даты изменения и местонахождение каждого элемента программного обеспечения.)
Спросите Siri. Произнесите, например: «Открой Информацию о системе». Узнайте, как спросить Siri.
Просмотр отчета о системе
Чтобы открыть отчет о системе, выберите меню Apple
> «Об этом Mac», затем нажмите «Отчет о системе».
Совет. Либо нажмите клавишу Option, и, удерживая ее, выберите меню Apple
> «Информация о системе».
Чтобы изменить внешний вид отчета, выполните одно из следующих действий.
Просмотр подробного отчета. Выберите меню «Файл» > «Показать больше информации». Размер файла отчета может достигать нескольких мегабайт.
Просмотр краткого отчета. Выберите меню «Файл» > «Показать меньше информации». Отчет будет включать большую часть информации об оборудовании и сети, но информация о программном обеспечении будет в нем отсутствовать.
Печать, сохранение или отправка отчета о системе
Чтобы открыть отчет о системе, выберите меню Apple
> «Об этом Mac», затем нажмите «Отчет о системе».
Выполните одно из следующих действий:
Печать отчета о системе. Выберите команду меню «Файл» > «Напечатать».
Сохранение отчета о системе. Выберите «Файл» > «Сохранить», введите имя файла и выберите местоположение для сохранения отчета.
Отправка отчета в компанию Apple. Выберите «Файл» > «Отправить в Apple». Если Вы позвоните в Службу поддержки Apple, то можете предоставить специалисту копию данных о конфигурации системы.
Просмотр сведений о системе в приложении «Об этом Mac»
Вы можете просмотреть информацию о своем компьютере Mac, включая название модели, используемую версию системы macOS и другие сведения.
Чтобы открыть раздел «Об этом Mac», выберите меню Apple
Нажмите любой из следующих пунктов.
Общие сведения. Просмотрите спецификацию компьютера Mac.
Мониторы. Получите сведения о мониторах, подключенных к Вашему Mac.
Накопители. Узнайте, какой объем накопителей задействован на Вашем устройстве и какие типы файлов на нем хранятся. См. раздел Просмотр сведений о доступном пространстве на диске.
Память. Узнайте, какой объем памяти установлен на Вашем Mac и сколько слотов доступно для расширения памяти. (Для некоторых моделей Mac панель «Память» может отсутствовать.)
Поддержка. Получите доступ к ресурсам поддержки программного обеспечения macOS и оборудования Mac.
Сервис. Узнайте о вариантах обслуживания, технической поддержки и ремонта для Вашего Mac.
С помощью приложения «Мониторинг системы» можно получить информацию о памяти компьютера.
Источник
Работа с USB устройствами в программе на C в MacOS X
Приветствую уважаемых читателей.
В этой небольшой статье я бы хотел рассмотреть вопрос взаимодействия с оборудованием (в данном случае с USB устройствами) в операционной системе MacOS X.
Будет рассмотрены очень интересный и полезный фреймворк IOKit, способ получения уведомлений о добавлении/удалении обордования, а так же получения полной информации об устройствах. Конечно данный материал не претендует на какую либо уникальность, т.к. каждый может разобраться с этими вопросами самостоятельно, изучив документацию Apple, а так же покурив разнообразные исходники на opensource.apple.com
Моя статья — попытка восполнить пробелл в русскоязычном материале подобного рода и описать некоторые грабли, с которыми могут столкнуться новичики.
Все кто заинтересовался — добро пожаловать под кат.
IOKit.
В ядре MacOS X существует замечательная вещь — фреймворк IOKit. Это объектно-ориентированный С++ фреймворк, разработанный специально для поддержки инфраструктуры драйверов оборудования. Правда С++ там несколько урезанный, например в нем отсутствуют исключения, RTTI, шаблоны. Остальная же часть ядра написана преемущественно на С.
Сам IOKit можно разделить на две части: собственно kernel framework, на котором пишутся драйвера и юзерспейсный IOKit.framework, предназначенный для простого доступа к kernel модулям (и соответственно оборудованию) из пользовательских приложений.
Объектно-ориентированная природа IOKit позволяет удобно отображать реальную физическую модель оборудования: USB устройство подключено, через USB порт подключено к хабу, хаб подключен соответствующему контроллеру в компьютере, этот контроллер, через шину PCI подключен к остальному чипсету материнской платы. Каждый IOKit драйвер является в этой модели либо конечным узлом (например USB модем) либо же связующим модулем (например контроллер USB порта), в терминологии Apple, последний назыается nub.
В комлект поставки XCode входит графическая утилита IORegExplorer, позволяющая просмотреть всю структуру IOKit модулей, прочитать разнообразные параметры и техническую информацию.
Сущетствует и консольный аналог утилиты — ioreg.
В этой статье будет рассмотрена работа только с юзерспейсным IOKit.framework. Если кого-то из читателей заинтересовал kernel framework — можно прочитать статью habrahabr.ru/post/36875, а так же замечательную книгу OS X and iOS Kernel Programming.
Получение уведомлений USB
Как уже говорилось выше, работать мы будем с USB, поэтому нам понадобится всего один заголовочный файл
Начнем с того, что подпишемся на получение уведомлений о добавлении/удалении USB устройств. В этом нам поможет специальный объект типа IONotificationPortRef.
Создадим и проинициализируем экземпляр IONotificationPortRef
Мы создали своего рода виртуальный порт, для прослушивания событий из IOKit (пока что не определено, каких именно). kIOMasterPortDefault — это константа, определяющая некий порт «по умолчанию» для получения сообщений из IOKit, всегда используйте это значение.
Теперь определим, какие именно сообщения мы хотим получать. Для этого необходимо создать так называемый словарь, воспользовавшись соответствующим контейнером базового фреймворка MacOS X.
Ключевым методом тут является IOServiceMatching, создающий словарь устройств класса USB, думаю, что это очевидно (существуют и другие константы, например для FireWire и т.п., позволяющие получать соответствующие уведомления). Далее мы «забираем» владения этим объектом, с помощью CFRetain. Это нужно для того, что бы не возникли проблемы с возможным двойным освобождением объекта в методах фреймворка IOKit. Собственно нам самим освобождать этот объект не нужно, в других же случаях никогда не забывайте вызывать CFRelease для аллоцированных в куче объектов (не полученных каким-либо Get* методом). Кроме того, всегда проверяйте, свежесозданные/свежеполученный *Ref объекты базового фрейморвка, на NULL, т.к. это, по сути, обычные указатели и работать с ними нужно соответствующе.
Далее «навесим» этот словарь на ранее созданный порт, как matching notification. Делается это методом IOServiceAddMatchingNotification.
Рассмотрим его внимательно
Первый параметр notifyPort — собственно порт, созданный нами ранее.
Второй параметр notificationType — тип уведомлений для данного словаря, такие как kIOTerminatedNotification, kIOMatchedNotification, kIOFirstMatchNotification. Думаю, что из названий этих констант вполне понятно, что они означают.
Третрий параметр matching — собственно словарь. Тип объекта, как можно заметить, — CFDictionaryRef. Это не проблема, т.к. CFMutableDictionaryRef без проблем приводится в тип CFDictionaryRef.
Четвертый метод callback — самый интересный. Это указатель на callback метод, вызываемый при поступлении соответствующего события. О нем чуть ниже.
Пятый параметр refCon — контекст коллбэк метода, тут можно передать свои данные этой функции.
Последний параметр notification — итератор, предназаченный для перебора коллекции устройств, этот аргумент инициализуруется в IOServiceAddMatchingNotification и так же передается callback методу, указывая на самое первое устройство в коллекции.
В случае успеха IOServiceAddMatchingNotification возвращает нуль, иначе — положительное число, код ошибки.
Callback функция определена таким образом:
typedef void (*IOServiceMatchingCallback)(void *refcon, io_iterator_t iterator);
Как видно, функция принимает те самые последние два аргумента из IOServiceAddMatchingNotification.
Нам необходимо объявить две такие функции — на добавление и на удаление устройств
А теперь, наконец, настроим уведомления.
Никакой дополнительной инициализации методов не требуется и обязательно проверяйте result код после каждого вызова IOServiceAddMatchingNotification.
Теперь нам необходимо настроить поток с циклом, в котором будет крутится наш прослушиватель. В MacOS X для данных целей предусмотрен соответствующий объект — CFRunLoop. Для нормальной работы данному объекту необходимо указатать так называемый источник и запустить в контексте текущего либо же какого-то другого потока, а после окончания работы — остановить.
Сделаем это так:
В данном случае мы добавляем источник уведомлений с помощью специального метода IONotificationPortGetRunLoopSource, использую наш порт уведомлений, кроме того, мы указываем идентификатор необходимого поток — в данном случае текущий поток CFRunLoopGetCurrent()
Далее этот поток можно стартовать и начинать получать уведомления. Но есть один нюанс, что бы все заработало — коллбэк методы нужно единожды вызвать вручную, как бы «протерировав» коллекцию. Если этого не сделать — уведомления приходить не будут.
Стар потока выполняется методом CFRunLoopRun(); Все, в этой точке выполнение кода не будет идти дальше. Остановить этот цикл можно только с помощью CFRunLoopStop, аргументом, этому методу, передается идентификатор того потока, где был запущен CFRunLoopRun, собственно то значение, что вернуло выше CFRunLoopGetCurrent. В многопоточной среде рекомендую сохранять это значение, что бы иметь возможность остановить RunLoop из контекста другого потока, просто указав корректный, сохраненный идентиификатор.
После остановки потока необходимо немного прибрать за собой:
Получение информации о USB устройствах
Итак, мы научились получать уведомления о добавлении/удалении USB устройств, теперь посмотрим как можно получить всю информацию об устройствах, непосредственно в callback методах.
По хорошему, оба методы должны сводится к вызову одного метода iterate_usb_devices
Здесь мы осуществляем проход по коллекции устройств, с помощью переданного итератора и IOIteratorNext, после использования объект необходимо освобождать в IOObjectRelease.
Каждый полученный объект usbDevice является источником всей необходимой информации. Простейший пример:
В случае успеха будет выведено читабельное имя устройства, например «Novatel wireless modem». io_name_t является по сути обычной char массивом.
Другой пример, получение полного пути к устройству, в иерархии IOKit:
Это самые простейшие случаи, т.к. с объектом usbDevice связан ещё целый словарь разнообразнейших параметров в виде пары ключ-значение. По соответствующим ключам можно получать соответствующие значения параметров, например, получим VendorID устройства.
Данный метод ищет соответствующий параметр по строковому ключу, в данном случае «idVendor» (CFSTR — это метод фреймворка MacOS X, выполняющий быстрое преобразование C-строки во внутренний объект типа CFStringRef)
IORegistryEntrySearchCFProperty возвращает NULL, если поиск не увенчался успехом, либо же указатель на объект искомого типа, в данном случае — CFNumberRef. Что бы «выудить» нормальное числовое значение из CFNumberRef, необходимо воспользоваться следующим:
Получение «ProductID» выполняется точно таким же образом, только в качестве ключа следует использовать строку «idProduct»
Разумеется, что список параметров и соответствующих ключей можно сильно варьироваться от устройства к устройству. У читателя может возникнут соответствующий вопрос — как узнать, какие параметры и по каким ключам нужно искать у данного устройства и как отобразить сразу все значения?
Делается это довольно просто:
В случае успешного выполнения данного метода мы получим в свое распоряжение словарь, заполненный всеми ключами/значениями устройства.
Самый простой способ, теперь, для печати этого словаря на экран — фреймворковый CFShow. Пару слов о нем, CFShow — это универсальный метод для задампливания любых объектов CoreFoundation Framework в MacOS X — CFMutableDictionaryRef, CFStringRef, CFNumberRef и т.д. Вывод выполняется в stderr.
Итак, выводим содержимое словаря на экран:
Теперь у нас есть список всех ключей и всех параметров, для данного устройтсва и мы можем использовать это знание, для получение конкретных значений в виде конкретных объектов (либо через IORegistryEntrySearchCFProperty, либо непосредственно из словаря, воспользовавшись методами для работы со словарями)
Рабочее приложение.
Теперь я бы хотел привести пример небольшого приложения, содержащего все, что выше описано. Кроме всего прочего, я решил добавить в этот пример обработку сигналов, что бы уметь корректно завершать приложение по Сtrl-С.
Примечание: В реальных проектах никогда не выполняйте такие действия в обработчике сигнала, почему, можете прочитать, например, в этом сообщении
Компиляция приложения выполняется командой
gcc usbnotify.c -framework IOKit -framework Foundation -o notifier
или же
clang usbnotify.c -framework IOKit -framework Foundation -o notifier
Результат выполнения обеих команд будет идентичен.
Ниже можно увидеть скриншоты работающего приложения с выводом информации о подключаемых и отключаемых устройствах
Источник