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