Интернет-соединение Realtek r8168 постоянно терпит неудачу

Нет.

Приложение (text )получает поток байтов на стандартный ввод. Приложение может считывать столько или меньше из них, как ему нравится, и действительно вызов readможет возвращать меньше запрошенного числа байтов . Он может свободно интерпретировать этот поток байтов по своему усмотрению , запрашивать чтение дополнительных байтов или рассматривать все как непрозрачные двоичные данные. Если он хочет интерпретировать некоторые байты как часть одного отдельного дискретного фрагмента, он может это сделать и продолжать поиск, пока не решит, что этот фрагмент у него есть. Ничто не гарантирует, что он получит все сразу , если только это не один байт.

Это короткий ответ, и вы можете прекратить чтение сейчас, если хотите :посылка вопроса ошибочна, вплоть до того, что приложение может делать все, что захочет, чтобы получить результат, который оно выбирает.

Ниже мы рассмотрим некоторые способы, которыми вещи могут (или не могут )работать, и когда они могут быть или не быть "атомарными" с чьей-либо точки зрения.


В оставшейся части ответа мы будем игнорировать сетевой трафик и трафик сокетов. Мы также собираемся принять довольно расплывчатое определение того, что такое «персонаж», поскольку оно кажется отправной точкой, и, возможно, уточним его по ходу дела. Мы рассмотрим вещи с точки зрения конечного приложения. В самом конце мы кратко рассмотрим (путь, в основном не относящийся к -теме ), начиная с аппаратной части клавиатуры. Это все равно будет слишком долго.


Приложение хочет получить вводимый символ

Приложение запрашивает readнесколько байтов из своего ввода.Затем он также может свободно интерпретировать полученные байты любым способом, который ему нравится, или попросить библиотеку сделать это за него. В случае, когда он ожидает текст, он будет интерпретировать эти байты через некоторую кодировку символов , которая определяет, что означает последовательность байтов. Будем надеяться, что он согласен с источником данных или терминалом относительно используемой кодировки (, но это не обязательно! ). Для любой кодировки приложение решает интерпретировать вещи как:

  • Если это кодировка ASCII, все в порядке, так как все в любом случае является одним -байтом.

  • Если это кодировка UCS -2, для 16 -бит wchar_t, ему лучше всего знать, сколько байтов уже прочитано, чтобы при необходимости запросить другой (, поскольку readможет в любой момент вернуть нечетное количество байтов, что даст вам половину единицы кода ).

  • Если эта кодировка — UTF -9 , то, вероятно, потребуется выполнить некоторые собственные битовые изменения, чтобы получить единицу кода, и практически невозможно доставить ее атомарно в современных системах.

  • Если эта кодировка — KEIS, атомарная доставка на ожидаемом уровне даже невозможна, потому что интерпретация последовательности зависит от смены режима с отслеживанием состояния в начале потока. Приложение должно помнить, что оно уже видело, чтобы знать, что означает эта часть ввода.

  • Если это кодировка UTF -8 , что в наши дни весьма вероятно, приложение может синхронизироваться с использованием любого отдельного байта, поскольку это самосинхронизирующаяся -кодировка :. старший бит равен 0 для единиц кода с одним байтом -и 1 для любой части многобайтовой последовательности -. Первый байт блока кода из 2 -, 3 -или 4 -байтов имеет 110, 1110 или 11110 соответственно, а байты продолжения начинаются с 10. Чтение одного байта говорит вам, сколько еще вам нужно, или что вы уже в середине чего-то.

    Если необходимо, приложение может захотеть создать секундуreadдля следующего байта (с ). Ему нужно запомнить частичный элемент, который он уже прочитал, и объединить две части вместе в конце. Возможно, даже потребуется сделать третье или четвертое чтение.

    Затем он может обрабатывать их дискретно по своему усмотрению, возможно, выдавая одно 32-битное -значение для кодовой точки. Возможно, было бы разумно абстрагировать это в функцию или библиотеку для повторного использования.

Существуют и другие кодировки со всеми этими и другими свойствами. Некоторые из них не разрешены POSIX в качестве системных кодировок, но могут быть согласованы между приложениями. Скорее всего, если у вас есть многобайтовая системная кодировка -в системе, подобной Unix -, это UTF -8.


Но что такое характер?

Мой многобайтовый -символ "é" может состоять из двух байтов UTF -8 (C3 A9 )или трех (65 CC 81 ), потому что это может быть один код точка (U+00E9 СТРОЧНАЯ ЛАТИНСКАЯ БУКВА E С АКТУАЛЬНЫМ АКЦЕНТОМ )или два (U+0065 СТРОЧНАЯ ЛАТИНСКАЯ БУКВА E + U+0301 КОМБИНИРОВАННОЕ АКТУАЛЬНОЕ УДАРЕНИЕ ). «‍‍‍» будет еще сложнее. Что ваше приложение считает атомарным? Это зависит от приложения, как на самом деле все до этого момента было.

Unicode называет эти символы с несколькими -кодовыми точками «кластерами графем». Если то, что вы хотите атомарно, является одним из этих, то вы делаете все вышеперечисленное, чтобы прочитать кодовую точку -, а затем вы сверяете ее с вашей таблицей состояния сегментации текста UAX29 и решаете, возможно ли это для еще одна кодовая точка в том же кластере. Если это так, вы пытаетесь прочитать все заново и продолжаете делать это, пока не дойдете до начала нового кластера, тупика в машине состояний или конца ввода.

Библиотека в приложении может абстрагироваться от чего-либо или всего этого и доставить поток байтов, единиц кода, кластеров графем или что-то еще. Например, если ваша программа написана на Swift, вы получите графемные кластеры. Если это на C, вы получаете байты, где «вы» включает все ваши библиотеки -, вы можете выбрать любое интегрированное поведение, которое вы хотите, пока вы работаете с API библиотеки, которая его предоставляет.

Другие многобайтовые -последовательности, такие как экранирование консоли для клавиш со стрелками или возврата (нажмите Ctrl -VВлево и посмотрите, что вы получите ), являются опять подобное :они одно целое или нет? Как вы говорите? Иногда вы не можете, и вы должны угадать. Например, система zkbd zsh просит вас нажать определенные клавиши, чтобы запомнить их для привязки клавиш -, но она просто использует тайм-аут, чтобы сообщить, когда завершен ввод одной последовательности. Позже он знает, видит ли он префикс последовательности, которую он распознает, и проверяет, получает ли он все, прежде чем действовать (что происходит через SSH при плохом соединении? ). В контексте это работает достаточно хорошо для того, что делается в то время, но в других ситуациях это может не работать. Это прикладной вопрос, как и другие.


Ничего из этого не адресовано (Unix -подобной )системой, которая доставляет только байты . Байт является атомарным на уровне API Unix, но по сути ничем другим. Все остальное зависит от приложения, которое оно должно применять для себя.

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


Как они вообще туда попали?

Что касается клавиатуры, то она отправляет сообщение в систему,который передает его драйверу клавиатуры ядра, который передает его X, который передает его эмулятору терминала, который отправляет некоторые закодированные байты на стандартный ввод. Каждое из этих сообщений имеет свою собственную кодировку и свой способ обмена и даже может быть разделено на несколько частей из предыдущего уровня (или объединено )-. Например, XCompose позволяет преобразовывать последовательности одного или нескольких нажатий клавиш в один или несколько виртуальных входов -, и вы можете подумать о том, как сделать все эти сообщения «атомарными», если хотите.

Первым сообщением, скорее всего, будет «клавиши 213 и 71 нажаты, Caps Lock выключен, num Lock включен»; предпоследнее событие X KeyPress (tryxev); последняя серия байтов, как обсуждалось. По существу ничего из этого не относится к -теме здесь, как системное программирование, общее программирование или проектирование аппаратного обеспечения, но может быть подходящим для некоторых других сетевых сайтов. Весь стек слишком широк, чтобы отвечать на все сразу в любом месте.

0
27.02.2021, 14:01
1 ответ

Вероятно, у вас установлен пакет драйвера с открытым исходным кодом "r8169". Установите драйвер «r8168 -dkms». Это собственность.

0
02.12.2021, 21:44

Теги

Похожие вопросы