Форум программистов, компьютерный форум, киберфорум
Наши страницы

С под Linux

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

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

29.12.2016, 11:41. Просмотров 403. Ответов 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. Вот как бы его и изучаю, возникли вопросы, поэтому и спрашиваю на этом форуме.

За помощь буду заранее благодарен!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.12.2016, 11:41
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Системные вызовы ядра и библиотека glibc (C Linux):

Cис. вызовы - C Linux
Доброго времени суток, подскажите ошибку в коде, а то уже пару дней голову ломаю - не компилица... #include <stdio.h> #include...

Заменить вызовы функции printf на write - C Linux
Доброго всем вечера!задали задание чтобы процесс породил новый процесс и позволял родительскому процессу завершиться раньше...

Вызовы read/write в цикле между процессами - C Linux
Необходимо реализовать два процесса: родительский считывает N чисел по одному и пишет их потомку, а потомок считывает эти числа и пишет их...

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

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

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

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

Морской бой можно попробовать реализовать через системные вызовы используя для отрисовки только первые 127 символов ASCII - удастся избежать гемора с кодировками. Размеры терминала - ioctl(), ввод/вывод легче всего через read/write. Так же придётся отрабатывать изменение размера терминала - это уже signal()/SIGWINCH, но не все эмуляторы терминалов отдают этот сигнал в запущенную прогу.
0
Evg
Эксперт CАвтор FAQ
18449 / 6499 / 454
Регистрация: 30.03.2009
Сообщений: 18,131
Записей в блоге: 29
30.12.2016, 21:33 #4
Цитата Сообщение от v4567 Посмотреть сообщение
Хочу написать данную игру используя только системные вызовы ядра
Не напишешь. Разные консоли используют разные методы (хотя в основном они одинаковы). К системным вызовам ядра никакого отношения не имеет
0
30.12.2016, 21:33
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.12.2016, 21:33
Привет! Вот еще темы с ответами:

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

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

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

Системные вызовы и работа с процессами - C++
Помогите пожалуйста с такой задачей: Родительский процесс считывает стандартной входной поток, передает его дочернему процессу, который...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

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