Как работает взаимодействие программы с внешними источниками (клавиатура/сеть) через потоки в контексте C++ iostream?
Stream взаимодействует с программой путем передачи данных между внешними источниками данных (например, файлы, клавиатура, сеть) и программой. В контексте C++ iostream, взаимодействие программы с внешними источниками данных осуществляется через потоки (streams). Потоки представляют собой абстракцию, которая позволяет программе обрабатывать данные как непрерывный поток, независимо от их источника. Для работы с внешними источниками данных с помощью потоков в C++, разработчик может использовать классы std::cin (стандартный поток ввода, отвечающий за взаимодействие с клавиатурой) и std::cout (стандартный поток вывода, отвечающий за вывод данных на экран). Например, чтобы прочитать данные, введенные пользователем с клавиатуры, и вывести их на экран, можно использовать следующий код: ```cpp #include <iostream> int main() { int num; std::cout << "Введите число: "; std::cin >> num; std::cout << "Вы ввели: " << num << std::endl; return 0; } ``` Этот код использует потоки ввода и вывода для взаимодействия с клавиатурой и вывода результата на экран. Таким образом, потоки в C++ iostream позволяют программе эффективно взаимодействовать с внешними источниками данных, такими как клавиатура или сеть.
iostream - лишь обертка над системными вызовами. Входной и выходной потоки - это концепция системы.
Это целый набор шаблонных классов, которые переопределяют операции побитового сдвига, поэтому у вас в программе используются<<
и>>
. Под капотом это все доходит до системных вызовов, которые пишут или читают данные в системные потоки (pipe). Там тупо команды "запиши вот эти байты" и "отдай мне вот в этот буфер максимум столько-то байт".
Система, насколько я знаю, для каждого pipe'а поддерживает какой-нибудь кольцевой буфер в который процессы могут писать и читать оттуда, через системные вызовы выше.
При работе с клавиатурой, дайвер клаиватуры получает команды от устройства. Операционная система, зная какое окно сейчас активно, посылает эти команды в поток для нужного окна.
При работе с сетью, дайвер сетевого устройства получает пакеты, обрабатывает их, передает операционке, она определяет, в какой поток надо эти данные записать, и записывает туда.
ОС-ка поддерживает список потоков, которые ждут чтения из каждого буфера. Когда что-то в буфер записывается, эти потоки просыпаются.