Како се користи функција цеви у језику Ц.

How Use Pipe Function C Language



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

О Пипе -у

У каналу се подаци одржавају у ФИФО редоследу, што значи записивање података на један крај цеви секвенцијално и читање података са другог краја цеви у истом секвенцијалном редоследу.







Ако било који процес чита из цеви, али ниједан други процес још није записан у цев, онда читање враћа крај датотеке. Ако процес жели да пише у цев, али не постоји други процес повезан са цевчицом за читање, онда је ово услов грешке и цев генерише СИГПИПЕ сигнал.



Хеадер Филе

#инцлуде

Синтакса



интцев(интподнесака[2])

Аргументс

Ова функција узима један аргумент, низ од два цела броја ( поднесака ). поља [0] користи се за читање са цеви, и поља [1] користи се за писање у цев. Процес који жели да се чита из цеви требало би да се затвори поља [1], а процес који се жели уписати у цев треба да се затвори поља [0] . Ако непотребни крајеви цеви нису експлицитно затворени, тада се крај датотеке (ЕОФ) никада неће вратити.





Повратне вредности

О успеху, цев() враћа 0, за неуспех функција враћа -1.

Сликовито можемо представити цев() функционише на следећи начин:



Испод је неколико примера који приказују како се користи функција пипе у језику Ц.

Пример 1

У овом примеру видећемо како функционише функција цеви. Иако коришћење цеви у једном процесу није од велике користи, добићемо идеју.

// Пример1.ц
#инцлуде
#инцлуде
#инцлуде
#инцлуде

интглавни()
{
интн;
интподнесака[2];
цхартампон[1025];
цхар *порука= 'Здраво Свете!';

цев(поднесака);
писати(поднесака[1],порука, стрлен (порука));

ако ((н=читати(поднесака[0],тампон, 1024 ) ) > = 0) {
тампон[н] = 0; // завршава низ
принтф ('очитавање %д бајта из цеви:'%с' н',н,тампон);
}
елсе
перрор ('читати');
излаз (0);
}

Овде смо прво креирали цев користећи цев() функција затим записана у цев помоћу слоновача [1] крај. Затим су подаци прочитани помоћу другог краја цеви, што је поља [0] . За читање и писање у датотеку, некада смо читати() и врите () функције.

Пример 2

У овом примеру видећемо како родитељски и подређени процеси комуницирају помоћу канала.

// Пример2.ц
#инцлуде
#инцлуде
#инцлуде
#инцлуде
#инцлуде

интглавни()
{
интподнесака[2],нбајта;
пид_т цхилдпид;
цхарниз[] = 'Здраво Свете! н';
цхарреадбуффер[80];

цев(поднесака);

ако((детињаст=виљушка()) == -1)
{
перрор ('виљушка');
излаз (1);
}

ако(детињаст== 0)
{
Близу(поднесака[0]);// Подређеном процесу није потребан овај крај цеви

/ * Пошаљите 'стринг' кроз излазну страну цеви */
писати(поднесака[1],низ, ( стрлен (низ)+1));
излаз (0);
}
елсе
{
/ * Надређени процес затвара излазну страну цеви */
Близу(поднесака[1]);// Родитељском процесу није потребан овај крај цеви

/ * Очитавање у низу из цеви */
нбајта=читати(поднесака[0],реадбуффер, величина(реадбуффер));
принтф ('Прочитани низ: %с',реадбуффер);
}

повратак(0);
}

Прво је једна цев креирана помоћу функције цеви, а затим је подређен процес рачван. Затим, подређени процес затвара крај читања и уписује у цев. Родитељски процес затвара крај за писање и чита из канала и приказује га. Овде је проток података само један начин од детета до родитеља.

Закључак:

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