Ц Програмирање

дуп2 системски позив у Ц

дуп2 системски позив у Ц
Тхе дуп2 () системска функција користи се за креирање копије постојећег дескриптора датотеке. У Линуку постоје 3 стандардна дескриптора датотека. Су:

стдин: Ово је стандардни дескриптор улазне датотеке. Подразумевано се користи за унос са терминала. сцанф (), гетц () итд функције користи стдин дескриптор датотеке за преузимање корисничких уноса. Тхе стдин дескриптор датотеке је такође представљен бројем 0.

стдоут: Ово је стандардни дескриптор излазне датотеке. Подразумевано се користи за испис нечега на конзолу / терминал. У широкој употреби принтф () функција користи стдоут да бисте исписали жељени излаз на конзолу / терминал. Тхе стдоут дескриптор датотеке је такође представљен бројем 1.

стдерр: Ово је стандардни дескриптор датотеке грешке. Ради исту ствар као и стдоут дескриптор датотеке. Тхе стдерр дескриптор датотеке користи се за испис порука о грешкама на конзоли / терминалу. Једина разлика је ако користите стдерр дескриптор датотеке за испис порука о грешкама и стдоут дескриптор датотеке за испис нормалних излаза, а затим их можете касније раздвојити. На пример, поруке о грешкама можете преусмерити у датотеку, а нормалне излазе на конзолу или другу датотеку. Тхе стдерр дескриптор датотеке је такође представљен бројем 2.

Осим ова 3 дескриптора датотека, у Ц можете створити додатне дескрипторе датотека. Да бисте креирали нови дескриптор датотеке, можете користити отворен () функција у Ц. Тхе отворен () функција отвара нову датотеку, креира дескриптор датотеке за ту датотеку и прилаже број који није 0, 1, 2 на дескриптор датотеке.

Једном када отворите датотеку помоћу отворен () функцију, можете користити читати() и напиши () функција за читање и писање у новостворени дескриптор датотеке.

Сада замислите ситуацију у којој желите да читате из одређене датотеке помоћу сцанф () или гетц () функцију и упишите у другу датотеку помоћу принтф () функцију. Ово није подразумевано понашање датотеке сцанф (), гетц () и принтф () функције као што сам раније објаснио. Подразумевано, сцанф () и гетц () функција користи стдин и принтф () користи стдоут и не постоји начин да се овим функцијама нареди да користе друге дескрипторе датотека. Дакле, да бисте променили ово подразумевано понашање, морате да замените стдин и стдоут дескриптори датотека са вашим жељеним дескрипторима датотека. Ово је оно што дуп2 () системска функција ради. Тхе дуп2 () функција копира дескриптор датотеке у други дескриптор датотеке.

синтакса и повратна вредност дуп2 ():

Синтакса дуп2 () функција је:

инт дуп2 (инт олд_филе_десцриптор, инт нев_филе_десцриптор);

дуп2 () функција копира олд_филе_десцриптор Инто тхе нев_филе_десцриптор. Ако је нев_филе_десцриптор већ постоји, затим се аутоматски затвара, а затим олд_филе_десцриптор се копира на њега.

О успеху, дуп2 () функција враћа нови дескриптор датотеке. Ако дође до грешке, дуп2 () враћа се -1.

Тхе дуп2 () функција је дефинисана у датотеци заглавља унистд.х.

Морате укључити заглавље унистд.х у вашој изворној датотеци Ц да бисте користили дуп2 () функционишу на следећи начин:

#инцлуде

За више информација погледајте ман страницу дуп2 () са следећом командом:

$ ман дуп2

Пример 1:

Направите нову изворну датотеку Ц 01_дуп2.ц и укуцајте следеће редове кодова у датотеку.

#инцлуде
#инцлуде
#инцлуде
#инцлуде
 
инт маин (воид)
инт број1, број2, сума;
 
инт инпут_фдс = опен ("./улазни.ткт ", О_РДОНЛИ);
 
иф (дуп2 (инпут_фдс, СТДИН_ФИЛЕНО)) < 0)
принтф ("Није могуће дуплирати дескриптор датотеке.");
излаз (ЕКСИТ_ФАИЛУРЕ);

 
сцанф ("% д% д", & број1, & број2);
 
збир = број1 + број2;
 
принтф ("% д +% д =% д \ н", број1, број2, збир);
 
ретурн ЕКСИТ_СУЦЦЕСС;

Сада креирајте нову датотеку улазни.ткт у исти директоријум и укуцајте следећи ред у њега.

15 41

Главни циљ овог програма је очитавање 2 целобројна броја из улазни.ткт датотека помоћу сцанф () функција, додајте их и одштампајте збир.

Прво, укључио сам потребне датотеке заглавља са следећим редовима кодова.

#инцлуде
#инцлуде
#инцлуде
#инцлуде

У главни() функције, дефинисао сам потребне променљиве.

инт број1, број2, сума;

Тада сам отворио датотеку улазни.ткт у режиму само за читање (О_РДОНЛИ) помоћу отворен () функцију и сачувао дескриптор датотеке у променљивој инпут_фдс.

инт инпут_фдс = опен ("./улазни.ткт ", О_РДОНЛИ);

Једном када добијем дескриптор датотеке улазни.ткт датотеку, копирао сам дескриптор датотеке у стандардни дескриптор улазне датотеке СТДИН_ФИЛЕНО (0) користећи дуп2 () функцију. Дескриптор датотеке улазни.ткт је сада подразумевано стдин дескриптор датотеке.

дуп2 (инпут_фдс, СТДИН_ФИЛЕНО)

Такође бих могао да напишем дуп2 () функционишу на следећи начин. Резултат би био исти. СТДИН_ФИЛЕНО држи вредност 0, што је вредност стдин дескриптор датотеке.

дуп2 (инпут_фдс, 0)

Такође сам проверио дуп2 () грешке у следећим редовима. Ако се грешка ипак догоди, програм је постављен да штампа поруку о грешци и изађе.

иф (дуп2 (инпут_фдс, СТДИН_ФИЛЕНО)) < 0)
принтф ("Није могуће дуплирати дескриптор датотеке.");
излаз (ЕКСИТ_ФАИЛУРЕ);

Тада сам користио сцанф () за скенирање 2 броја са улазни.ткт датотека.

сцанф ("% д% д", & број1, & број2);

Затим сам додао бројеве и зброј одштампао на конзоли / терминалу, што је подразумевано стдоут.

збир = број1 + број2;
принтф ("% д +% д =% д \ н", број1, број2, збир);

Као што видите, добио сам очекивани излаз након што покренем програм.

Пример 2:

Направите нову изворну датотеку Ц 02_дуп2.ц и укуцајте следеће редове кодова у датотеку.

#инцлуде
#инцлуде
#инцлуде
#инцлуде
#инцлуде
#инцлуде
инт маин (воид)
инт број1, број2, сума;
инт инпут_фдс = опен ("./улазни.ткт ", О_РДОНЛИ);
инт оутпут_фдс = опен ("./ оутпут.ткт ", О_ВРОНЛИ | О_ЦРЕАТ, С_ИРУСР | С_ИВУСР);
дуп2 (инпут_фдс, СТДИН_ФИЛЕНО);
дуп2 (оутпут_фдс, СТДОУТ_ФИЛЕНО);
сцанф ("% д% д", & број1, & број2);
збир = број1 + број2;
принтф ("% д +% д =% д \ н", број1, број2, збир);
ретурн ЕКСИТ_СУЦЦЕСС;

Сада креирајте нову датотеку улазни.ткт у исти директоријум и укуцајте следећи ред у њега.

15 41

У овом програму сам урадио исто што и у Пример 1. Једина разлика је у томе што сам креирао нову датотеку излаз.ткт и користио је дескриптор датотеке излаза.ткт као подразумевани стдоут дескриптор датотеке помоћу дуп2 () функцију. Сада су сви излази принтф () функција ће бити записана у излаз.ткт датотека.

Направио сам нову датотеку и сачувао дескриптор датотеке у оутпут_фдс променљива.

инт оутпут_фдс = опен ("./ оутпут.ткт ", О_ВРОНЛИ | О_ЦРЕАТ, С_ИРУСР | С_ИВУСР);

Такође сам копирао дескриптор датотеке оутпут_фдс у дескриптор датотеке стдоут. Користио сам предефинисану константу СТДОУТ_ФИЛЕНО.

дуп2 (оутпут_фдс, СТДОУТ_ФИЛЕНО);

СТДОУТ_ФИЛЕНО садржи вредност 1 (подразумевана вредност дескриптора датотеке стдоут). Дакле, могао бих да препишем позив функције дуп2 () на следећи начин. То би дало исте резултате.

дуп2 (оутпут_фдс, 1);

Остатак програма је исти. Као што видите, једном кад покренем програм, он не штампа ништа на конзоли / терминалу.

Али, програм је створио нову датотеку излаз.ткт датотека.

Као што видите, излаз се записује у датотеку излаз.ткт.

Ако желите да напишете све грешке (стдерр) у другу датотеку, а затим такође можете копирати дескриптор датотеке у стдерр дескриптор датотеке на следећи начин.

дуп2 (еррор_фдс, СТДЕРР_ФИЛЕНО);

Дакле, тако користите дуп2 () системски позив у Ц. Хвала што сте прочитали овај чланак.

Најбољи Линук Дистрос за игре у 2021
Линук оперативни систем далеко је превалио свој изворни, једноставни изглед заснован на серверима. Овај ОС се изузетно побољшао последњих година и сад...
Како снимити и стримовати своју играћу сесију на Линук-у
У прошлости се играње игара сматрало само хобијем, али с временом је играчка индустрија забележила огроман раст у погледу технологије и броја играча. ...
Најбоље игре за ручно праћење
Оцулус Куест је недавно представио сјајну идеју ручног праћења без контролера. Са све већим бројем игара и активности које извршавају подршку формално...