Программирование на C

Системный вызов dup2 в C

Системный вызов dup2 в C
В dup2 () системная функция используется для создания копии существующего файлового дескриптора. В Linux есть 3 стандартных файловых дескриптора. Они есть:

стандартный ввод: Это стандартный дескриптор входного файла. По умолчанию он используется для ввода данных с терминала. 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. Спасибо, что прочитали эту статью.

5 лучших аркад для Linux
В настоящее время компьютеры - это серьезные машины, используемые для игр. Если вы не можете получить новый рекорд, вы поймете, о чем я. В этом посте ...
Битва за Веснот 1.13.6 Выпущена разработка
Битва за Веснот 1.13.6, выпущенная в прошлом месяце, является шестой разработкой в ​​1.13.x и содержит ряд улучшений, в первую очередь пользовательско...
Как установить League Of Legends на Ubuntu 14.04
Если вы поклонник League of Legends, то это возможность для вас протестировать League of Legends. Обратите внимание, что LOL поддерживается в PlayOnLi...