На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела *nix / gcc / Eclipse / Qt / wxWidgets / GTK+
  • При создании темы ОБЯЗАТЕЛЬНО указывайте версию тулкита / библиотеки / компилятора.
  • Перед тем как задать вопрос, сформулируйте его правильно, чтобы вас могли понять.
  • Нарушение Правил может повлечь наказание со стороны модераторов.


Полезные ссылки:
user posted image Boost по-русски
user posted image Qt по-русски
Модераторы: archimed7592
  
> Системные вызовы ядра и библиотека glibc
    Изучаю программирование под 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. Вот как бы его и изучаю, возникли вопросы, поэтому и спрашиваю на этом форуме.

    За помощь буду заранее благодарен!
      Цитата v4567 @
      Сразу предвижу шквал предложений использовать библиотеку glibc, ncurses.
      Первый момент общий по поводу библиотеки Си - glibc.
      Я понимаю так, что библиотека glibc виртуальная, в ней нет ассемблерного кода, а значит она вызывает системные вызовы ядра и работает только через них и никак иначе, что логично.

      glibc - это вариант библиотеки "С"-функций.
      Чем она, собственно, не нравится и почему её нежелательно использовать ?
      malloc, printf... итд.
      Не понятно главное - как эта библиотека может помешать написанию
      игры "морской бой" ?
      :huh:
      Если есть желание отличиться, можно попытаться преодолеть
      другое препятствие.
      Например, написать сетевую игру.
      Чтобы юзеры играли в "морской бой" по сети друг с другом.
        Цитата v4567 @
        Я понимаю так, что библиотека glibc виртуальная, в ней нет ассемблерного кода, а значит она вызывает системные вызовы ядра и работает только через них и никак иначе, что логично.
        Библиотека glibc вовсе не виртуальная, она вполне реально стоит на большинстве систем GNU/Linux.
        Откуда в ней взяться ассемблерному коду или коду на языке скажем C? она давно откомпилирована и содержит бинарные коды. Так что, наверно, имеется в виду, что она написана не на ассемблере, а на языке высокого уровня. Однако, то, что библиотека большей частью написана на C (там есть и модули, написанные на ассемблере), совершенно не мешает делать в C-коде ассемблерные вставки.
        Даже если бы библиотека целиком была написана на ассемблере, не освобождало бы её от необходимости работать только через системные вызовы. Просто потому, что в пользовательском режиме программа не имеет необходимого доступа.

        Так что, совершенно не логично.

        Цитата v4567 @
        Как мне при помощи системных вызовов ядра, опять же повторяю только системных вызовов ядра, не использую функции библиотеки glibc, получить информацию о терминале.
        Скопируй соответствующий код из библиотеки в свою программу. Оно тебе надо?
        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script execution time: 0,0210 ]   [ 17 queries used ]   [ Generated: 28.03.24, 16:13 GMT ]