стандартный ввод: Это стандартный дескриптор входного файла. По умолчанию он используется для ввода данных с терминала. scanf (), getc () функции и т. д. использует стандартный ввод файловый дескриптор для ввода данных пользователем. В стандартный ввод дескриптор файла также представлен числом 0.
стандартный вывод: Это стандартный дескриптор выходного файла. Он используется для вывода чего-либо на консоль / терминал по умолчанию. Широко используемый printf () функция использует стандартный вывод для вывода желаемого результата на консоль / терминал. В стандартный вывод дескриптор файла также представлен числом 1.
stderr: Это стандартный файловый дескриптор ошибок. Он делает то же самое, что и стандартный вывод дескриптор файла. В stderr файловый дескриптор используется для вывода сообщений об ошибках на консоль / терминал. Единственная разница в том, если вы используете stderr дескриптор файла для печати сообщений об ошибках и стандартный вывод дескриптор файла для печати обычных выходных данных, затем вы можете позже разделить их. Например, вы можете перенаправить сообщения об ошибках в файл, а обычный вывод - в консоль или другой файл. В stderr дескриптор файла также представлен числом 2.
Помимо этих трех файловых дескрипторов, вы можете создать дополнительные файловые дескрипторы на C. Чтобы создать новый дескриптор файла, вы можете использовать открыто() функция в C. В открыто() функция открывает новый файл, создает файловый дескриптор для этого файла и прикрепляет номер, отличный от 0, 1, 2 к файловому дескриптору.
После открытия файла с помощью открыто() функцию, вы можете использовать читать() а также написать() функция для чтения и записи во вновь созданный файловый дескриптор.
Теперь представьте ситуацию, когда вы хотите читать из определенного файла, используя scanf () или же getc () функцию и записать в другой файл, используя printf () функция. Это не поведение по умолчанию scanf (), getc () а также printf () функционирует, как я объяснил ранее. По умолчанию, scanf () а также getc () функция использует стандартный ввод а также printf () использует стандартный вывод и нет способа указать этим функциям использовать другие файловые дескрипторы. Итак, чтобы изменить это поведение по умолчанию, вы должны заменить стандартный ввод а также стандартный вывод файловые дескрипторы с желаемыми файловыми дескрипторами. Это то, что dup2 () системная функция делает. В dup2 () функция копирует файловый дескриптор в другой файловый дескриптор.
dup2 () Синтаксис и возвращаемое значение:
Синтаксис dup2 () функция:
int dup2 (int old_file_descriptor, int new_file_descriptor);dup2 () функция копирует old_file_descriptor в new_file_descriptor. Если new_file_descriptor уже существует, затем он автоматически закрывается, а затем old_file_descriptor скопировано на него.
В случае успеха dup2 () функция возвращает новый дескриптор файла. Если произошла ошибка, dup2 () возвращается -1.
В dup2 () функция определена в файле заголовка unistd.час.
Вы должны включить заголовок unistd.час в исходном файле C, чтобы использовать dup2 () функционируют следующим образом:
#включатьДля получения дополнительной информации проверьте справочную страницу dup2 () с помощью следующей команды:
$ man dup2Пример 1:
Создайте новый исходный файл на C 01_dup2.c и введите следующие строки кода в файл.
#включать#включать
#включать
#включать
int main (void)
int число1, число2, сумма;
int input_fds = open ("./Вход.txt ", O_RDONLY);
если (dup2 (input_fds, STDIN_FILENO) < 0)
printf ("Невозможно скопировать дескриптор файла.");
выход (EXIT_FAILURE);
scanf ("% d% d", & число1, & число2);
сумма = число1 + число2;
printf ("% d +% d =% d \ n", число1, число2, сумма);
вернуть EXIT_SUCCESS;
Теперь создайте новый файл Вход.текст в том же каталоге и введите в нем следующую строку.
15 41Основная задача этой программы - прочитать 2 целых числа из Вход.текст файл с использованием scanf () функцию, сложите их и распечатайте сумму.
Сначала я включил необходимые файлы заголовков со следующими строками кода.
#включать#включать
#включать
#включать
в основной() функции, я определил необходимые переменные.
int число1, число2, сумма;Затем я открыл файл Вход.текст в режиме только для чтения (O_RDONLY) с помощью открыто() функция и сохранил дескриптор файла в переменной input_fds.
int input_fds = open ("./Вход.txt ", O_RDONLY);Когда у меня есть файловый дескриптор Вход.текст файла, я скопировал дескриптор файла в стандартный дескриптор входного файла STDIN_FILENO (0) используя dup2 () функция. Файловый дескриптор Вход.текст теперь по умолчанию стандартный ввод дескриптор файла.
dup2 (input_fds, STDIN_FILENO)Я мог бы также написать dup2 () функционировать следующим образом. Результат будет таким же. STDIN_FILENO имеет ценность 0, что является значением стандартный ввод дескриптор файла.
dup2 (input_fds, 0)Я также проверил dup2 () ошибки со следующими строками. В случае возникновения ошибки программа настроена на печать сообщения об ошибке и завершение работы.
если (dup2 (input_fds, STDIN_FILENO) < 0)printf ("Невозможно скопировать дескриптор файла.");
выход (EXIT_FAILURE);
Затем я использовал scanf () отсканировать 2 числа из Вход.текст файл.
scanf ("% d% d", & число1, & число2);Затем я добавил числа и распечатал сумму на консоли / терминале, по умолчанию стандартный вывод.
сумма = число1 + число2;printf ("% d +% d =% d \ n", число1, число2, сумма);
Как видите, я получил ожидаемый результат после запуска программы.
Пример 2:
Создайте новый исходный файл на C 02_dup2.c и введите следующие строки кода в файл.
#включать#включать
#включать
#включать
#включать
#включать
int main (void)
int число1, число2, сумма;
int input_fds = open ("./Вход.txt ", O_RDONLY);
int output_fds = open ("./выход.txt ", O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);
dup2 (input_fds, STDIN_FILENO);
dup2 (output_fds, STDOUT_FILENO);
scanf ("% d% d", & число1, & число2);
сумма = число1 + число2;
printf ("% d +% d =% d \ n", число1, число2, сумма);
вернуть EXIT_SUCCESS;
Теперь создайте новый файл Вход.текст в том же каталоге и введите в нем следующую строку.
15 41В этой программе я сделал то же, что и в Пример 1. Единственная разница в том, что я создал новый файл выход.текст и использовал файловый дескриптор вывода.txt по умолчанию стандартный вывод файловый дескриптор с использованием dup2 () функция. Теперь весь вывод printf () функция будет записана в выход.текст файл.
Я создал новый файл и сохранил его дескриптор в output_fds Переменная.
int output_fds = open ("./выход.txt ", O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);Я также скопировал дескриптор файла output_fds в дескриптор файла stdout. Я использовал предопределенную константу STDOUT_FILENO.
dup2 (output_fds, STDOUT_FILENO);STDOUT_FILENO содержит значение 1 (значение дескриптора файла по умолчанию стандартный вывод). Итак, я мог бы переписать вызов функции dup2 () следующим образом. Это даст те же результаты.
dup2 (output_fds, 1);В остальном программа такая же. Как видите, как только я запускаю программу, она ничего не выводит на консоль / терминал.
Но программа создала новый файл выход.текст файл.
Как видите, вывод записывается в файл выход.текст.
Если хотите записать все ошибки (stderr) в другой файл, то вы также можете скопировать дескриптор файла в stderr файловый дескриптор следующим образом.
dup2 (error_fds, STDERR_FILENO);Итак, как вы используете dup2 () системный вызов в C. Спасибо, что прочитали эту статью.