|
3 / 2 / 4
Регистрация: 10.05.2008
Сообщений: 148
|
|
Системные вызовы ядра и библиотека glibc29.12.2016, 11:41. Показов 1975. Ответов 6
Метки нет (Все метки)
Изучаю программирование под linux, что бы процесс изучения не был скучным решил написать игру - морской бой.
Игра будет работать в консоли - буквы цифры, начиная 80x25 и с большим разрешением. Графика символами псевдографики. Хочу написать данную игру используя только системные вызовы ядра, повторяю ТОЛЬКО СИСТЕМНЫЕ ВЫЗОВЫ ЯДРА!!!! Сразу предвижу шквал предложений использовать библиотеку glibc, ncurses. Но ведь библиотека ncurses сама работает через системные вызовы ядра linux. Я прав? Вот я и хочу разобраться как можно написать эту игру используя только системные вызовы ядра linux!!!! Приступая к делу обнаружил пробелы в ряде вопросов. Итак: Немного отступлю от темы, просто хотелось бы выяснить некоторые вопросы. Первый момент общий по поводу библиотеки Си - glibc. Я понимаю так, что библиотека glibc виртуальная, в ней нет ассемблерного кода, а значит она вызывает системные вызовы ядра и работает только через них и никак иначе, что логично. Правильно ли я понимаю? Если это так, то из этого следует второй момент. Если я не ошибаюсь то файл текущего терминала /dev/tty, не важно какой это терминал: виртуальный и открыт в графическом эмуляторе терминала, не виртуальный соединённый через com порт, буквенно цифровой 80x25 и т.д. файл текущего открытого терминала в котором работают всё равно будет /dev/tty правильно я понимаю, это так? Далее если это так, то используя только системные вызовы ядра, повторяю только системные вызовы ядра, в терминал я могу при неканоническом вводе, вводить символы и выводить их, следующими системными вызовами ядра write и read при этом в начале не забыв для файла терминала /dev/tty назначить дескриптор - функцией open, а в конце работы закрыть этот файл системным вызовом close. Правильно ли я понимаю? Если всё выше изложенное правильно то тогда идём дальше. Как мне при помощи системных вызовов ядра, опять же повторяю только системных вызовов ядра, не использую функции библиотеки glibc, получить информацию о терминале. Например геометрию терминала, сколько в открытом терминале символов по горизонтали и строк и т. д. Конкретно какая мне ещё будет нужна другая информация кроме числа символов и строк я ещё не знаю. Но число символов и число строк нужно что бы правильно "разрисовать" интерфейс программы в терминале. Он будет состоять из символов псевдо-графики, для морского боя хватит. Да вот ещё нужно узнать какая локализация, koi8-r, utf8 или ещё какая и наверное перевести локализацию в utf8. В библиотеке glibc очень много функций для работы с терминалом: isatty, tcsetattr, tcgetattr и т.д. очень много всяких структур данных. Конечно при помощи этих функций и структур данных можно работать с терминалом. Но я хотел бы узнать как можно полноценно работать с терминалом не используя библиотеку glibc, а пользуясь только системными вызовами ядра. Ну например как я уже писал выше, ввести данные и вывести я уже знаю как write, read, open, close, а вот как получить какое в используемом терминале /dev/tty количество символов и строк при помощи системных вызовов ядра? В моём посте я всё время повторяю - системные вызовы ядра, потому, что хотел узнать как можно это реализовать не используя библиотеки glibc или ncurses!!!! Предвижу ещё вопросы, а сможешь ли ты вообще написать саму логику игры и т. д. С разработкой самого алгоритма игры у меня проблем нет. Разные алгоритмы я разрабатываю без проблем. У меня проблемы, а вернее отсутствие знаний по самому ядру linux. Вот как бы его и изучаю, возникли вопросы, поэтому и спрашиваю на этом форуме. За помощь буду заранее благодарен!
0
|
|
| 29.12.2016, 11:41 | |
|
Ответы с готовыми решениями:
6
Системные вызовы
Системные вызовы |
|
153 / 148 / 66
Регистрация: 20.02.2014
Сообщений: 556
|
||||
| 29.12.2016, 12:05 | ||||
|
Кури маны по ioctl()
0
|
||||
| 30.12.2016, 10:31 | ||
|
Надо всего использовать достаточно высокоуровневые либы для работы с терминалами (slang или ncurses). Если же их использовать нельзя - то всё-равно не обойтись одними лишь системными вызовами - придётся обращаться к бд termcap Морской бой можно попробовать реализовать через системные вызовы используя для отрисовки только первые 127 символов ASCII - удастся избежать гемора с кодировками. Размеры терминала - ioctl(), ввод/вывод легче всего через read/write. Так же придётся отрабатывать изменение размера терминала - это уже signal()/SIGWINCH, но не все эмуляторы терминалов отдают этот сигнал в запущенную прогу.
0
|
||
|
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
|
||
| 02.07.2021, 19:08 | ||
|
Подскажите пожалуйста, что же такое glibc ? То есть я конечно почитал в интернете, что это стандартная библиотека "С", но я не могу понять, эта библиотека поставляется вместе с компилятором ? Или как ? Вот по аналогии с Windows - glibc что это будет ?
0
|
||
|
367 / 223 / 53
Регистрация: 18.10.2017
Сообщений: 2,387
|
|
| 04.07.2021, 19:09 | |
|
glibc поставляется вместе с ядром. В цитате ведь описано, что она делает.
2
|
|
|
13 / 13 / 0
Регистрация: 21.10.2011
Сообщений: 58
|
|
| 06.07.2021, 10:49 | |
|
glibc это интерфейс к ядру (так же есть ряд функций, которые предоставляет сама библиотека). Если проводить аналогию с Windows, то это WinAPI
P.S. Как там морской бой поживает, уже есть на что посмотреть?
1
|
|
| 06.07.2021, 10:49 | |
|
Помогаю со студенческими работами здесь
7
Системные вызовы Qt и системные вызовы Pintos системные вызовы Системные вызовы Ubuntu Системные вызовы в Linux Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
|
Оттенки серого
Argus19 18.03.2026
Оттенки серого
Нашёл в интернете 3 прекрасных модуля:
Модуль класса открытия диалога открытия/ сохранения файла на Win32 API;
Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
|
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога
Финальные проекты на Си и на C++:
finish-rectangles-sdl3-c. zip
finish-rectangles-sdl3-cpp. zip
|
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие.
Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
|
|
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ВВЕДЕНИЕ
Выполняя задание на управление насосной группой заполнения резервуара,. . .
|
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
|
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога
Финальные проекты на Си и на C++:
hello-sdl3-c. zip
hello-sdl3-cpp. zip
Результат:
|
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога
MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
|