stdin : это стандартный дескриптор входного файла. По умолчанию он используется для ввода данных с терминала. Функции scanf () , getc () и т. д. используют файловый дескриптор stdin для ввода данных пользователем. Дескриптор файла stdin также представлен числом 0 .
stdout : Это стандартный дескриптор выходного файла. По умолчанию он используется для вывода чего-либо на консоль/терминал. Широко используемая функция printf () использует stdout для вывода желаемого результата на консоль/терминал. Дескриптор файла stdout также представлен числом 1 .
stderr : Это стандартный дескриптор файла ошибок. Он выполняет то же самое, что и файловый дескриптор stdout . Файловый дескриптор stderr используется для вывода сообщений об ошибках на консоль/терминал. Единственное отличие состоит в том, что если вы используете файловый дескриптор stderr для печати сообщений об ошибках и файловый дескриптор stdout для печати обычных выходных данных, то позже вы можете разделить их. Например, вы можете перенаправить сообщения об ошибках в файл, а обычные выходные данные — в консоль или другой файл. Файловый дескриптор stderr также представлен числом 2 .
Помимо этих трех файловых дескрипторов, вы можете создать дополнительные файловые дескрипторы в C. Чтобы создать новый файловый дескриптор, вы можете использовать функцию open () в C. Функция open () открывает новый файл , создает файловый дескриптор для этого файла и прикрепляет номер, отличный от 0 , 1 , 2 , к файловому дескриптору .
После открытия файла с помощью функции open () вы можете использовать read () и write () для чтения и записи во вновь созданный файловый дескриптор.
Теперь представьте ситуацию, когда вы хотите читать из определенного файла с помощью scanf () или getc () и записать в другой файл с помощью функции printf () . Это не поведение по умолчанию для функций scanf () , getc () и printf () , как я объяснил. ранее. По умолчанию функции scanf () и getc () используют stdin и printf () использует stdout , и нет способа указать этим функциям использовать другие файловые дескрипторы. Итак, чтобы изменить это поведение по умолчанию, вы должны заменить файловые дескрипторы stdin и stdout желаемыми файловыми дескрипторами.. Это то, что делает системная функция dup2 () . Функция dup2 () копирует дескриптор файла в другой дескриптор файла.
Синтаксис и возвращаемое значение dup2 ():
синтаксис функции dup2 () :
dup2 () функция копирует old_file_descriptor в new_file_descriptor . Если дескриптор_нового_файла уже существует, он автоматически закрывается, а затем в него копируется дескриптор_старого_файла .
В случае успеха Функция dup2 () возвращает дескриптор нового файла. В случае ошибки dup2 () возвращает -1 .
dup2 () функция определена в файле заголовка unistd.h .
Вы должны включить заголовок unistd.h в свой Исходный файл C для использования функции dup2 () следующим образом:
Для получения дополнительной информации проверьте страницу руководства dup2 () с помощью следующей команды:
Пример 1:
Создайте новый исходный файл C 01_dup2.c и введите следующие строки кодов в файле.
#include
#include
#include
int main (void) {
int number1, number2, sum;
Int input_fds = open («./input.txt», O_RDONLY);
if (dup2 (input_fds, STDIN_FILENO) printf («Невозможно скопировать дескрипт файла или. «);
exit (EXIT_FAILURE);
}
scanf («% d% d «, & number1, & number2);
сумма = число1 + число2;
printf («% d +% d =% d n», число1, число2, сумма);
return EXIT_SUCCESS;
}
Теперь создайте новый файл input.txt в том же каталоге и введите следующая строка в нем.
Основная цель этой программы — прочитать 2 целых числа из input.txt с помощью функции scanf () , добавьте их и распечатайте сумму.
Сначала я включил требуемый заголовок файлы со следующими строками кода.
#include
#include
#include
В функции main () я определил необходимые переменные.
Затем я открыл файл input.txt только для чтения режим ( O_RDONLY ) с помощью функции open () и сохранил дескриптор файла в переменной input_fds .
Как только у меня есть файловый дескриптор файл input.txt , я скопировал дескриптор файла в дескриптор стандартного входного файла STDIN_FILENO (0) с помощью dup2 () сильная> функция. Файловый дескриптор input.txt теперь является дескриптором файла по умолчанию stdin .
Я мог бы также написать функцию dup2 () следующим образом. Результат будет таким же. STDIN_FILENO содержит значение 0 , которое является значением дескриптора файла stdin .
Я также проверил ошибки dup2 () в следующих строках. В случае возникновения ошибки программа настроена на печать сообщения об ошибке и завершение работы.
exit (EXIT_FAILURE);
}
Затем я использовал scanf () для сканирования 2 чисел из файла input.txt .
Затем я добавил числа и распечатал сумму на консоли/терминале, по умолчанию stdout .
printf («% d +% d =% d n», number1, number2, sum);
Как видите, я получил ожидаемый результат после запуска программы.
Пример 2:
Создайте новый исходный файл C 02_dup2.c и введите следующие строки кода в файл.
#include
#include
#include
#include
#include
int main (void) {
int number1, number2, sum;
int input_fds = open («./input.txt», O_RDONLY);
int output_fds = open («./output.txt», O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);
dup2 (input_fds, STDIN_FILENO);
dup2 (output_fds, STDOUT_FILENO);
scanf («% d% d», & number1, & number2);
Sum = number1 + number2;
printf («% d +% d =% d n», number1, number2, sum);
return EXIT_SUCCESS;
}
Теперь создайте новый файл input.txt в том же каталоге и введите в нем следующую строку.
В этой программе я сделал то же, что и в примере 1 . Единственное отличие состоит в том, что я создал новый файл output.txt и использовал дескриптор файла output.txt в качестве дескриптора файла по умолчанию stdout , используя функция dup2 () . Теперь весь вывод функции printf () будет записан в файл output.txt .
Я создал новый файл и сохраненный дескриптор файла в переменной output_fds .
Я также скопировал файловый дескриптор output_fds в файловый дескриптор stdout. Я использовал предопределенную константу STDOUT_FILENO .
STDOUT_FILENO содержит значение 1 (значение дескриптора файла по умолчанию stdout ). Итак, я мог бы переписать вызов функции dup2 () следующим образом. Это даст те же результаты.
Остальная часть программы такая же. Как видите, после запуска программы она ничего не печатает на консоли/терминале.
Но программа создала новый файл output.txt .
Как видите, вывод записывается в файл output.txt .
Если вы хотите записывать все ошибки ( stderr ) в другой файл, то вы также можете скопировать файловый дескриптор в файловый дескриптор stderr следующим образом.
Итак, вот как вы используете системный вызов dup2 () в C. Спасибо за чтение этой статьи.