Позив система цеви у Ц.

Pipe System Call C



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

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







интцев(интпипефд[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 бајта у Ц. Дакле, да бисте послали 4 -цифрени ПИН кроз цев, морате да упишете 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;и<ПИН_ЛЕНГТХ;и++) {
пин[и] = 48 + ред () % 7;
}

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


интглавни(празнина) {
док(1) {
интпипефдс[2];
цхарпин[ПИН_ЛЕНГТХ+ 1];
цхартампон[ПИН_ЛЕНГТХ+ 1];

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

пид_т пид=виљушка();

ако(пид== 0) {
гетПИН(пин); // генерише ПИН
Близу(пипефдс[0]); // затвори читање фд
писати(пипефдс[1],пин,ПИН_ЛЕНГТХ+ 1); // уписује ПИН у канал

принтф („Генерисање ПИН -а код детета и слање родитељу ... н');

спавај(ПИН_ВАИТ_ИНТЕРВАЛ); // намерно одлагање генерисања ПИН -а.

излаз (ЕКСИТ_СУЦЦЕСС);
}

ако(пид> 0) {
чекати(НУЛА); // чекамо да дете заврши

Близу(пипефдс[1]); // затвори писање фд
читати(пипефдс[0],тампон,ПИН_ЛЕНГТХ+ 1); // читање ПИН -а са канала
Близу(пипефдс[0]); // затвори читање фд
принтф ('Родитељ је примио ПИН'%с 'од детета. н н',тампон);
}
}

повратакЕКСИТ_СУЦЦЕСС;
}

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

Родитељски процес затим чита ПИН из цеви и штампа га.

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

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

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

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