Каким образом stream взаимодействует с программой?

Как работает взаимодействие программы с внешними источниками (клавиатура/сеть) через потоки в контексте C++ iostream?
  • 3 августа 2024 г. 18:23
Ответы на вопрос 2
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'а поддерживает какой-нибудь кольцевой буфер в который процессы могут писать и читать оттуда, через системные вызовы выше.

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

ОС-ка поддерживает список потоков, которые ждут чтения из каждого буфера. Когда что-то в буфер записывается, эти потоки просыпаются.
Похожие вопросы