Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
3 / 2 / 4
Регистрация: 10.05.2008
Сообщений: 148

Системные вызовы ядра и библиотека glibc

29.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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.12.2016, 11:41
Ответы с готовыми решениями:

Системные вызовы
Как осуществить вывод счета в секундах на консоль (своеобразный таймер). и как организовать отсчет числа секунд в обратном направлении? ...

Системные вызовы, библиотека cstdio
Здравствуйте, уважаемые форумчане! Назрели 2(4) вопроса касательно разработки ОС на Asm/C++: 1. Системные вызовы. а) Организация ...

Системные вызовы
Дали задание: • Вывести имя компьютера; • Вывести имя пользователя; • Вывести версию ядра операционной системы; • Применить в...

6
153 / 148 / 66
Регистрация: 20.02.2014
Сообщений: 556
29.12.2016, 12:05
Цитата Сообщение от v4567 Посмотреть сообщение
Я понимаю так, что библиотека glibc виртуальная, в ней нет ассемблерного кода, а значит она вызывает системные вызовы ядра и работает только через них и никак иначе, что логично. Правильно ли я понимаю?
Нет. Любой вызов любой функции - это код. А libc - это обычная шаред либа (а что вообще есть виртуальная либа?), в которой хранятся и функции юзер-спейса и вызовы в ядро. Например, strcmp() вообще не будет делать никаких системных вывзовов. printf() использует буфферизованный вывод - пока буфер вывода не заполнится (хотя там, конечно, более сложный алгоритм) вызывать write() она не будет.

Цитата Сообщение от v4567 Посмотреть сообщение
следующими системными вызовами ядра write и read при этом в начале не забыв для файла терминала /dev/tty назначить дескриптор - функцией open, а в конце работы закрыть этот файл системным вызовом close. Правильно ли я понимаю?
Для каждого запущенного процесса система ассоциирует stdin, stdout stderr на устройства по умолчанию - типа клава и экран. Куда это будет все ссылаться зависит от пользователя, либо настроек. По сути это макросы к константам 0, 1, 2 соответсвенно. Поэтому чтобы писать в консоль тебе нужно вызывать write(1, ...)

Цитата Сообщение от v4567 Посмотреть сообщение
В библиотеке glibc очень много функций для работы с терминалом
Все они так или иначе вызывают ioctl() с разными параметрами.
Кури маны по ioctl()
0
599 / 421 / 137
Регистрация: 02.10.2008
Сообщений: 1,798
Записей в блоге: 1
30.12.2016, 10:31
Цитата Сообщение от v4567 Посмотреть сообщение
Как мне при помощи системных вызовов ядра, опять же повторяю только системных вызовов ядра, не использую функции библиотеки glibc, получить информацию о терминале
Лучше не лезть в чисто системные вызовы и ioctl. Например, тот же konsole или gnome-terminal это эмуляторы терминала и прога, работающая исключительно через int 33h или ioctl не сможет адекватно работать с ними.
Надо всего использовать достаточно высокоуровневые либы для работы с терминалами (slang или ncurses). Если же их использовать нельзя - то всё-равно не обойтись одними лишь системными вызовами - придётся обращаться к бд termcap

Морской бой можно попробовать реализовать через системные вызовы используя для отрисовки только первые 127 символов ASCII - удастся избежать гемора с кодировками. Размеры терминала - ioctl(), ввод/вывод легче всего через read/write. Так же придётся отрабатывать изменение размера терминала - это уже signal()/SIGWINCH, но не все эмуляторы терминалов отдают этот сигнал в запущенную прогу.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
30.12.2016, 21:33
Цитата Сообщение от v4567 Посмотреть сообщение
Хочу написать данную игру используя только системные вызовы ядра
Не напишешь. Разные консоли используют разные методы (хотя в основном они одинаковы). К системным вызовам ядра никакого отношения не имеет
0
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
02.07.2021, 19:08
Цитата Сообщение от Вованя Посмотреть сообщение
Нет. Любой вызов любой функции - это код. А libc - это обычная шаред либа (а что вообще есть виртуальная либа?), в которой хранятся и функции юзер-спейса и вызовы в ядро. Например, strcmp() вообще не будет делать никаких системных вывзовов. printf() использует буфферизованный вывод - пока буфер вывода не заполнится (хотя там, конечно, более сложный алгоритм) вызывать write() она не будет.
Здравствуйте,

Подскажите пожалуйста, что же такое glibc ?
То есть я конечно почитал в интернете, что это стандартная библиотека "С", но я не могу понять, эта библиотека поставляется вместе с компилятором ? Или как ?

Вот по аналогии с Windows - glibc что это будет ?
0
 Аватар для peter_irich
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.07.2021, 10:49
Помогаю со студенческими работами здесь

Системные вызовы
Мне нужно продемонстрировать работу системных вызовов windows на с++. Как это можно сделать?

Qt и системные вызовы
Здравствуйте. Задался таким вопросом - можно ли в Qt производить вызов системных вызовов Linux? Можно ли там подключать Си-шные...

Pintos системные вызовы
подскажите, пжлста, какие-нибудь линки или книги, где можно прочитать как работать в Пинтос, как писать системные вызовы и программки,...

Системные вызовы Ubuntu
Доброго времени суток. Надеюсь, не ошибся с разделом. Недавно записался на онлайн курс по Linux, но немного подзавис на заданиях, которые...

Системные вызовы в Linux
Системные вызовы в Linux В Linux, в отличие от Windows, прямые системные вызовы используются довольно часто. По меньшей мере,...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Переходник 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 и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru