Форум программистов, компьютерный форум CyberForum.ru

С под Linux

Войти
Регистрация
Восстановить пароль
 
v4567
0 / 0 / 4
Регистрация: 10.05.2008
Сообщений: 87
#1

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

29.12.2016, 11:41. Просмотров 353. Ответов 3
Метки нет (Все метки)

Изучаю программирование под 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. Вот как бы его и изучаю, возникли вопросы, поэтому и спрашиваю на этом форуме.

За помощь буду заранее благодарен!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.12.2016, 11:41     Системные вызовы ядра и библиотека glibc
Посмотрите здесь:
C Linux Cис. вызовы
C Linux Заменить вызовы функции printf на write
Вызовы read/write в цикле между процессами C Linux
Модули ядра C Linux
C Linux Выбор ядра для исполнения
C Linux Написать простейший модуль ядра
C Linux Ожидание завершения потоков ядра
Модуль ядра, работа с мышью C Linux
C Linux Модуль ядра, создающий файл с текстом
Модуль ядра, вывод сообщения в dmesg C Linux
Как научиться программированию ядра Linux C Linux
Простой бенчмарк для ядра Linux C Linux

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Вованя
122 / 122 / 47
Регистрация: 20.02.2014
Сообщений: 436
29.12.2016, 12:05     Системные вызовы ядра и библиотека glibc #2
Цитата Сообщение от 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()
drfaust
256 / 146 / 37
Регистрация: 02.10.2008
Сообщений: 530
Записей в блоге: 1
Завершенные тесты: 1
30.12.2016, 10:31     Системные вызовы ядра и библиотека glibc #3
Цитата Сообщение от v4567 Посмотреть сообщение
Как мне при помощи системных вызовов ядра, опять же повторяю только системных вызовов ядра, не использую функции библиотеки glibc, получить информацию о терминале
Лучше не лезть в чисто системные вызовы и ioctl. Например, тот же konsole или gnome-terminal это эмуляторы терминала и прога, работающая исключительно через int 33h или ioctl не сможет адекватно работать с ними.
Надо всего использовать достаточно высокоуровневые либы для работы с терминалами (slang или ncurses). Если же их использовать нельзя - то всё-равно не обойтись одними лишь системными вызовами - придётся обращаться к бд termcap

Морской бой можно попробовать реализовать через системные вызовы используя для отрисовки только первые 127 символов ASCII - удастся избежать гемора с кодировками. Размеры терминала - ioctl(), ввод/вывод легче всего через read/write. Так же придётся отрабатывать изменение размера терминала - это уже signal()/SIGWINCH, но не все эмуляторы терминалов отдают этот сигнал в запущенную прогу.
Evg
Эксперт CАвтор FAQ
17470 / 5708 / 363
Регистрация: 30.03.2009
Сообщений: 15,677
Записей в блоге: 26
30.12.2016, 21:33     Системные вызовы ядра и библиотека glibc #4
Цитата Сообщение от v4567 Посмотреть сообщение
Хочу написать данную игру используя только системные вызовы ядра
Не напишешь. Разные консоли используют разные методы (хотя в основном они одинаковы). К системным вызовам ядра никакого отношения не имеет
Yandex
Объявления
30.12.2016, 21:33     Системные вызовы ядра и библиотека glibc
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru