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

Системски позив цевовода у Ц

Системски позив цевовода у Ц
цев() је системска функција Линук-а. Тхе цев() системска функција користи се за отварање дескриптора датотека, који се користе за комуникацију између различитих Линук процеса. Укратко, цев() функција се користи за међупроцесну комуникацију у Линуку.  У овом чланку ћу вам показати како се користи системска функција пипе () у Линуку. Па, кренимо.

Све о цеви () Функција:

Синтакса цев() функција је:

инт цев (инт пипефд [2]);

Овде функција пипе () ствара једносмерни канал података за међупроцесну комуникацију. Пролазите у инт Низ (целобројни) тип пипефд састоји се од 2 елемента низа у функцијску цијев (). Тада функција пипе () креира два дескриптора датотека у пипефд низ.

Први елемент пипефд низ, пипефд [0] користи се за очитавање података из цеви.

Други елемент пипефд низ, пипефд [1] користи се за уписивање података у цев.

У успеху, функција пипе () враћа 0. Ако се током иницијализације цеви догоди грешка, тада функција пипе () враћа -1.

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

#инцлуде

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

$ ман 2 пипе
Упута за употребу пипе ().

Пример 1:

За први пример, креирајте нову изворну датотеку Ц 1_пипе.ц и укуцајте следеће редове кодова.

#инцлуде
#инцлуде
#инцлуде
 
инт маин (воид)
инт пипефдс [2];
 
иф (пипе (пипефдс) == -1)
перрор ("цев");
излаз (ЕКСИТ_ФАИЛУРЕ);

 
принтф ("Читај вредност дескриптора датотеке:% д \ н", пипефдс [0]);
принтф ("Напиши вредност дескриптора датотеке:% д \ н", пипефдс [1]);
 
ретурн ЕКСИТ_СУЦЦЕСС;

Овде сам укључио заглавни фајл пипе () унистд.х прво следећим редом.

#инцлуде

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

инт пипефдс [2];

Затим сам покренуо функцију пипе () за иницијализацију низа дескриптора датотека пипефдс као што следи.

цев (пипефдс)

Такође сам проверио грешке користећи повратну вредност функције пипе (). Користио сам излаз () функција за терминал програма у случају да функција цијеви закаже.

иф (пипе (пипефдс) == -1)
перрор ("цев");
излаз (ЕКСИТ_ФАИЛУРЕ);

Затим сам одштампао вредност дескриптора датотека за читање и писање цеви пипефдс [0] и пипефдс [1] редом.

принтф ("Читај вредност дескриптора датотеке:% д \ н", пипефдс [0]);
принтф ("Напиши вредност дескриптора датотеке:% д \ н", пипефдс [1]);

Ако покренете програм, требало би да видите следећи излаз. Као што видите, вредност дескриптора датотеке прочитане цеви пипефдс [0] је 3 и напишите дескриптор датотеке датотеке цеви пипефдс [1] је 4.

Пример 2:

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

#инцлуде
#инцлуде
#инцлуде
#инцлуде
 
инт маин (воид)
инт пипефдс [2];
пуфер цхар [5];
 
иф (пипе (пипефдс) == -1)
перрор ("цев");
излаз (ЕКСИТ_ФАИЛУРЕ);

 
цхар * пин = "4128 \ 0";
 
принтф ("Записивање ПИН-а у цијев ... \ н");
писање (пипефдс [1], пин, 5);
принтф ("Готово.\ н \ н ");
 
принтф ("Читање ПИН-а из цеви ... \ н");
читање (пипефдс [0], бафер, 5);
принтф ("Готово.\ н \ н ");
 
принтф ("ПИН са цеви:% с \ н", бафер);
 
ретурн ЕКСИТ_СУЦЦЕСС;

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

Овде сам сачувао 4-знаковни ПИН код у цхар низ. Дужина низа је 5 (укључујући НУЛЛ знак \ 0).

цхар * пин = "4128 \ 0";

Сваки АСЦИИ знак је величине 1 бајт у језику Ц. Дакле, да бисте послали четвороцифрени ПИН кроз цев, у цев морате уписати 5 бајтова (4 + 1 НУЛЛ знак) података.

За писање 5 бајтова података (пин) у цев, користио сам напиши () функција помоћу дескриптора датотеке пипе пипе пипефдс [1] као што следи.

писање (пипефдс [1], пин, 5);

Сад кад имам неке податке у цеви, могу их прочитати из цеви користећи читати() функција на опису датотеке датотеке за читање пипефдс [0]. Као што сам написао 5 бајтова података (пин) у цев, читаћу и 5 бајтова података из цеви. Очитани подаци ће се чувати у тампон низ знакова. Како ћу читати 5 бајтова података из цеви, тампон низ знакова мора бити дугачак најмање 5 бајтова.

Ја сам дефинисао тампон низ знакова на почетку главни() функцију.

пуфер цхар [5];

Сада могу да прочитам ПИН из цеви и да га сачувам у тампон низ са следећим редом.

читање (пипефдс [0], бафер, 5);

Сад кад сам прочитао ПИН из цеви, могу га одштампати помоћу принтф () функционишу као и обично.

принтф ("ПИН са цеви:% с \ н", бафер);

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

Пример 3:

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

#инцлуде
#инцлуде
#инцлуде
#инцлуде
#инцлуде
инт маин (воид)
инт пипефдс [2];
цхар * пин;
пуфер цхар [5];
 
иф (пипе (пипефдс) == -1)
перрор ("цев");
излаз (ЕКСИТ_ФАИЛУРЕ);

 
пид_т пид = форк ();
 
иф (пид == 0) // у подређеном процесу
пин = "4821 \ 0"; // ПИН за слање
затвори (пипефдс [0]); // затвори читање фд
писање (пипефдс [1], пин, 5); // уписивање ПИН-а у пипе
 
принтф ("Генерисање ПИН-а у детету и слање родитељу ... \ н");
спавање (2); // намерно одлагање
излаз (ЕКСИТ_СУЦЦЕСС);

 
иф (пид> 0) // у главном процесу
сачекајте (НУЛЛ); // сачекајте да се процес дете заврши
затвори (пипефдс [1]); // затварање фд
читање (пипефдс [0], бафер, 5); // читање ПИН-а из цеви
затвори (пипефдс [0]); // затвори читање фд
 
принтф ("Родитељ је примио ПИН '% с' \ н", бафер);

 
ретурн ЕКСИТ_СУЦЦЕСС;

У овом примеру показао сам вам како да користите цев за међупроцесну комуникацију. Послао сам ПИН из подређеног процеса у надређени процес помоћу цеви. Затим прочитајте ПИН из цеви у надређеном процесу и одштампајте га из надређеног процеса.

Прво, креирао сам подређени процес помоћу функције форк ().

пид_т пид = форк ();

Затим, у процесу детета (пид == 0), Написао сам ПИН на цев користећи напиши () функцију.

писање (пипефдс [1], пин, 5);

Једном када се ПИН упише у цев из подређеног процеса, надређени процес (пид> 0) прочитајте из цеви помоћу читати() функцију.

читање (пипефдс [0], бафер, 5);

Затим је надређени поступак одштампао ПИН помоћу принтф () функционишу као и обично.

принтф ("Родитељ је примио ПИН '% с' \ н", бафер);

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

Пример 4:

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

#инцлуде
#инцлуде
#инцлуде
#инцлуде
#инцлуде
 
#дефине ПИН_ЛЕНГТХ 4
#дефине ПИН_ВАИТ_ИНТЕРВАЛ 2
 
воид гетПИН (цхар пин [ПИН_ЛЕНГТХ + 1])
сранд (гетпид () + гетппид ());
 
пин [0] = 49 + ранд ()% 7;
 
за (инт и = 1; и < PIN_LENGTH; i++)
пин [и] = 48 + ранд ()% 7;

 
пин [ПИН_ЛЕНГТХ] = '\ 0';

 
 
инт маин (воид)
док (1)
инт пипефдс [2];
цхар пин [ПИН_ЛЕНГТХ + 1];
цхар бафер [ПИН_ЛЕНГТХ + 1];
 
цев (пипефдс);
 
пид_т пид = форк ();
 
иф (пид == 0)
гетПИН (пин); // генерисање ПИН-а
затвори (пипефдс [0]); // затвори читање фд
писање (пипефдс [1], пин, ПИН_ЛЕНГТХ + 1); // уписивање ПИН-а у пипе
 
принтф ("Генерисање ПИН-а у детету и слање родитељу ... \ н");
 
спавање (ПИН_ВАИТ_ИНТЕРВАЛ); // намерно одлагање генерисања ПИН-а.
 
излаз (ЕКСИТ_СУЦЦЕСС);

 
иф (пид> 0)
сачекајте (НУЛЛ); // чекање да дете заврши
 
затвори (пипефдс [1]); // затварање писања фд
читање (пипефдс [0], бафер, ПИН_ЛЕНГТХ + 1); // читање ПИН-а из цеви
затвори (пипефдс [0]); // затвори читање фд
принтф ("Родитељ је добио ПИН '% с' од детета.\ н \ н ", бафер);


 
ретурн ЕКСИТ_СУЦЦЕСС;

Овај пример је исти као Пример 3. Једина разлика је у томе што овај програм континуирано ствара подређени процес, генерише ПИН у подређеном процесу и шаље ПИН надређеном процесу помоћу цеви.

Надређени поступак затим чита ПИН са цеви и исписује га.

Овај програм генерише нови ПИН_ЛЕНГТХ ПИН сваке ПИН_ВАИТ_ИНТЕРВАЛ секунде.

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

Програм можете зауставити само притиском на + Ц.

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

Битка за Веснотх 1.13.6 Развој објављен
Битка за Веснотх 1.13.6 објављено прошлог месеца, шесто је развојно издање у издању 1.13.к сериес и доноси низ побољшања, посебно корисничког интерфеј...
Како инсталирати Леагуе Оф Легендс на Убунту 14.04
Ако сте љубитељ Леагуе оф Легендс, ово је прилика да тестирате Леагуе оф Легендс. Имајте на уму да је ЛОЛ подржан на ПлаиОнЛинук ако сте корисник лину...
Инсталирајте најновију ОпенРА Стратеги Гаме на Убунту Линук
ОпенРА је Либре / Фрее Реал Тиме стратешки механизам који ствара ране Вествоод игре попут класичне Цомманд & Цонкуер: Ред Алерт. Дистрибуирани модови ...