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

dup2 Системно обаждане в C

dup2 Системно обаждане в C
The dup2 () системната функция се използва за създаване на копие на съществуващ дескриптор на файл. В Linux има 3 стандартни файлови дескриптора. Те са:

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. Благодаря, че прочетохте тази статия.

5 най-добри аркадни игри за Linux
В днешно време компютрите са сериозни машини, използвани за игри. Ако не можете да получите новия висок резултат, ще разберете какво имам предвид. В т...
Битка за Уеснот 1.13.6 Разработка освободена
Битка за Уеснот 1.13.6, издаден миналия месец, е шестата версия за разработка в 1.13.x серия и предоставя редица подобрения, най-вече на потребителски...
Как да инсталирате League Of Legends на Ubuntu 14.04
Ако сте фен на League of Legends, това е възможност за вас да тествате League of Legends. Имайте предвид, че LOL се поддържа на PlayOnLinux, ако сте п...