Unix / Linux - Стандартные потоки В/В

Здравствуйте, будущие маги Linux! Сегодня мы окунемся в магический мир стандартных потоков В/В в Unix и Linux. Не волнуйтесь, если вы новички в программировании - я буду вашим доброжелательным проводником в этом приключении, как я делал это для countless студентов на протяжении многих лет преподавания. Так что возьмите свой виртуальный рюкзак и отправляйтесь на исследование!

Unix / Linux - Standard I/O Streams

Что такое стандартные потоки В/В?

Прежде чем мы углубимся в Details, давайте поймем, что такое стандартные потоки В/В. Представьте их как особые каналы, через которые ваша программа может общаться с внешним миром. Так же, как и мы, люди, имеем различные способы взаимодействия - говорим, слушаем и иногда кричим, когда что-то идет не так, наши программы имеют эти потоки.

Существует три основных потока:

  1. Стандартный Ввод (stdin)
  2. Стандартный Вывод (stdout)
  3. Стандартная Ошибка (stderr)

Давайте разберем их по одному.

Стандартный Ввод (stdin)

Стандартный Ввод, часто сокращаемый до stdin, как уши программы. Это то, как программа слушает информацию от пользователя или других источников.

Пример 1: Чтение из stdin

#include <stdio.h>

int main() {
char name[50];
printf("Как ваше имя? ");
scanf("%s", name);
printf("Здравствуйте, %s!\n", name);
return 0;
}

В этом примере scanf читает из stdin. Когда вы запустите эту программу, она подождет, пока вы что-то наберете и нажмите Enter. Это и есть действие stdin!

Стандартный Вывод (stdout)

Стандартный Вывод или stdout, как рот программы. Это то, как программа говорит нам, показывая результаты или сообщения.

Пример 2: Запись в stdout

#include <stdio.h>

int main() {
printf("Здравствуйте, мир!\n");
fprintf(stdout, "Это также отправляется в stdout.\n");
return 0;
}

Both printf и fprintf(stdout, ...) пишут в stdout. Когда вы запустите эту программу, вы увидите оба сообщения, напечатанные в вашем терминале.

Стандартная Ошибка (stderr)

Стандартная Ошибка или stderr, как способ программы кричать, когда что-то идет не так. Она используется для сообщений об ошибках и диагностики.

Пример 3: Использование stderr

#include <stdio.h>

int main() {
FILE *file = fopen(" несуществующий.txt", "r");
if (file == NULL) {
fprintf(stderr, "Ошибка: Не удалось открыть файл!\n");
return 1;
}
// Оставшаяся часть кода...
return 0;
}

Здесь, если файл не существует, мы используем fprintf(stderr, ...) для вывода сообщения об ошибке.

Перенаправление потоков

Теперь, где это становится действительно интересным! В Unix/Linux мы можем перенаправлять эти потоки. Это как если бы мы дали нашей программе другие уши или рот. Давайте посмотрим, как это делается:

Перенаправление stdin

$ ./program < input.txt

Это берет ввод из input.txt вместо клавиатуры.

Перенаправление stdout

$ ./program > output.txt

Это отправляет вывод в output.txt вместо экрана.

Перенаправление stderr

$ ./program 2> error.txt

Это отправляет сообщения об ошибках в error.txt.

Трубы: Подключение программ

Вот классный трюк: мы можем подключить вывод одной программы к вводу другой с помощью труб (|). Это как если бы программы играли в игру "电话"!

$ echo "Здравствуйте, мир!" | wc -w

Это подсчитывает слова в "Здравствуйте, мир!". Вывод echo становится вводом для wc.

Стандартные функции В/В

Давайте посмотрим на некоторые.common функции, используемые с этими потоками:

Функция Описание Поток
scanf Чтение форматированного ввода stdin
printf Запись форматированного вывода stdout
fprintf Запись форматированного вывода в поток Любой
fgets Чтение строки Любой
fputs Запись строки Любой
fread Чтение двоичных данных Любой
fwrite Запись двоичных данных Любой

Личное воспоминание

Я помню, когда я впервые преподавал этот концепт, один студент спросил: "Но профессор, зачем нам нужны разные потоки? Couldn't мы просто использовать один для всего?" Я улыбнулся и сказал: "Представьте, что вы находитесь в шумном ресторане. Вы говорите, чтобы заказать еду, слушаете, чтобы узнать, когда ваша еда готова, и вы можете закричать, если у вас проблемы с заказом. Вот почему у нас есть разные потоки - у каждого есть своя цель!"

Заключение

Понимание стандартных потоков В/В похоже на изучение ABC программного взаимодействия. Это основа для более сложных концепций, с которыми вы столкнетесь на своем пути в программировании. Помните, каждый великий программист начинал с того места, где вы находитесь сейчас. Continue practicing, stay curious, и скоро вы будете передавать данные как профессионал!

Счастливого кодирования, будущие технические звезды! ?

Credits: Image by storyset