Извикване на тръбна система в C

Pipe System Call C



тръба() е системна функция на Linux. The тръба() системната функция се използва за отваряне на файлови дескриптори, които се използват за комуникация между различни Linux процеси. Накратко, тръба() функцията се използва за междупроцесна комуникация в Linux. В тази статия ще ви покажа как да използвате системната функция pipe () в Linux. И така, нека започнем.

Синтаксисът на тръба() функцията е:







intтръба(intpipefd[2]);

Тук функцията pipe () създава еднопосочен канал за данни за комуникация между процесите. Преминавате в int (Integer) тип масив pipefd състоящ се от 2 елемента на масива към функцията pipe (). Тогава функцията pipe () създава два файлови дескриптора в pipefd масив.



Първият елемент на pipefd масив, pipefd [0] се използва за четене на данни от тръбата.



Вторият елемент на pipefd масив, pipefd [1] се използва за записване на данни в тръбата.





При успех функцията pipe () връща 0. Ако възникне грешка по време на инициализацията на тръбата, тогава функцията pipe () връща -1.

Функцията pipe () е дефинирана в заглавката unistd.h . За да използвате функцията pipe () във вашата C програма, трябва да включите заглавката unistd.h както следва:



#включва

За повече информация относно системната функция pipe () проверете страницата man на pipe () със следната команда:

$ човек2тръба
Човешката страница на тръбата().

Пример 1:

За първия пример създайте нов C изходен файл 1_pipe.c и въведете следните редове кодове.

#включва
#включва
#включва

intглавен(невалиден) {
intpipefds[2];

ако(тръба(pipefds) == -1) {
ужас ('тръба');
изход (EXIT_FAILURE);
}

printf („Прочетете стойността на дескриптора на файла: %dн',pipefds[0]);
printf („Запишете стойност на дескриптора на файл: %dн',pipefds[1]);

връщанеEXIT_SUCCESS;
}

Тук включих заглавния файл на pipe () unistd.h първо със следния ред.

#включва

След това, в main () функция, дефинирах pipefds двуелементен масив със следния ред.

intpipefds[2];

След това стартирах функцията pipe (), за да инициализирам масива с дескриптори на файлове pipefds както следва.

тръба(pipefds)

Проверих и за грешки, използвайки връщаната стойност на функцията pipe (). Използвах изход () функция за прекратяване на програмата в случай на неуспех на тръбната функция.

ако(тръба(pipefds) == -1) {
ужас ('тръба');
изход (EXIT_FAILURE);
}

След това отпечатах стойността на файловите дескриптори за четене и запис pipefds [0] и pipefds [1] съответно.

printf („Прочетете стойността на дескриптора на файла: %dн',pipefds[0]);
printf („Запишете стойност на дескриптора на файл: %dн',pipefds[1]);

Ако стартирате програмата, трябва да видите следния изход. Както можете да видите, стойността на дескриптора на файла за четене на тръба pipefds [0] е 3 и напишете дескриптор на файлови тръби pipefds [1] е 4 .

Пример 2:

Създайте друг C изходен файл 2_pipe.c и въведете следните редове кодове.

#включва
#включва
#включва
#включва

intглавен(невалиден) {
intpipefds[2];
charбуфер[5];

ако(тръба(pipefds) == -1) {
ужас ('тръба');
изход (EXIT_FAILURE);
}

char *щифт= 4128 0';

printf („Записване на ПИН код в тръба ...н');
пиши(pipefds[1],щифт, 5);
printf ('Свършен.нн');

printf („Четене на ПИН от тръбата ...н');
Прочети(pipefds[0],буфер, 5);
printf ('Свършен.нн');

printf („ПИН от тръбата: %sн',буфер);

връщанеEXIT_SUCCESS;
}

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

Тук запазих 4-знаков ПИН код в char масив. Дължината на масива е 5 (включително символа NULL 0).

char *щифт= 4128 0';

Всеки ASCII символ е с размер 1 байт в C. Така че, за да изпратите 4 -цифрения ПИН през тръбата, трябва да напишете 5 байта (4 + 1 NULL символ) данни в тръбата.

За да напишете 5 байта данни ( щифт ) в тръбата, използвах пиши () функция, използвайки файловия дескриптор на тръбата за запис pipefds [1] както следва.

пиши(pipefds[1],щифт, 5);

Сега, когато имам някои данни в тръбата, мога да ги прочета от тръбата с помощта на Прочети() функция на файловия дескриптор за четене на тръба pipefds [0] . Тъй като съм написал 5 байта данни ( щифт ) в тръбата ще чета и 5 байта данни от тръбата. Прочетените данни ще се съхраняват в буфер символен масив. Тъй като ще чета 5 байта данни от тръбата, буфер символният масив трябва да е с дължина поне 5 байта.

Аз съм дефинирал буфер символен масив в началото на main () функция.

charбуфер[5];

Сега мога да прочета ПИН кода от тръбата и да го съхраня в буфер масив със следния ред.

Прочети(pipefds[0],буфер, 5);

След като прочетох ПИН кода от тръбата, мога да го отпечатам с помощта на printf () функционира както обикновено.

printf („ПИН от тръбата: %sн',буфер);

След като стартирам програмата, се показва правилния изход, както можете да видите.

Пример 3:

Създайте нов C изходен файл 3_pipe.c като тип в следващите редове кодове.

#включва
#включва
#включва
#включва
#включва
intглавен(невалиден) {
intpipefds[2];
char *щифт;
charбуфер[5];

ако(тръба(pipefds) == -1) {
ужас ('тръба');
изход (EXIT_FAILURE);
}

pid_t pid=вилица();

ако(пид== 0) { // в дочерния процес
щифт= 4821 0'; // ПИН за изпращане
близо(pipefds[0]); // затваряне на четене fd
пиши(pipefds[1],щифт, 5); // запис на ПИН в тръба

printf („Генериране на ПИН в дете и изпращане на родител ...н');
сън(2); // умишлено забавяне
изход (EXIT_SUCCESS);
}

ако(пид> 0) { // в основния процес
изчакайте(НУЛА); // изчакайте завършването на дъщерния процес
близо(pipefds[1]); // затваряне на запис fd
Прочети(pipefds[0],буфер, 5); // четене на PIN от тръбата
близо(pipefds[0]); // затваряне на четене fd

printf („Родителят е получил ПИН код„%s “н',буфер);
}

връщанеEXIT_SUCCESS;
}

В този пример ви показах как да използвате тръба за комуникация между процесите. Изпратих ПИН код от дъщерния процес до родителския процес, използвайки канал. След това прочетете ПИН кода от тръбата в родителския процес и го отпечатайте от родителския процес.

Първо, създадох дъщерен процес, използвайки функцията fork ().

pid_t pid=вилица();

След това в процеса на детето ( pid == 0 ), Написах ПИН кода с помощта на пиши () функция.

пиши(pipefds[1],щифт, 5);

След като ПИН е записан в тръбата от дъщерния процес, родителският процес ( pid> 0 ) прочетете го от тръбата с помощта на Прочети() функция.

Прочети(pipefds[0],буфер, 5);

След това родителският процес отпечатва ПИН кода с помощта printf () функционира както обикновено.

printf („Родителят е получил ПИН код„%s “н',буфер);

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

Пример 4:

Създайте нов C изходен файл 4_pipe.c като тип в следващите редове кодове.

#включва
#включва
#включва
#включва
#включва

#дефинирайте PIN_LENGTH 4
#дефинирайте PIN_WAIT_INTERVAL 2

невалиденgetPIN(charщифт[PIN_LENGTH+ 1]) {
srand (избухвам() +getppid());

щифт[0] = 49 + ред () % 7;

за(inti= 1;i<PIN_LENGTH;i++) {
щифт[i] = 48 + ред () % 7;
}

щифт[PIN_LENGTH] = ' 0';
}


intглавен(невалиден) {
докато(1) {
intpipefds[2];
charщифт[PIN_LENGTH+ 1];
charбуфер[PIN_LENGTH+ 1];

тръба(pipefds);

pid_t pid=вилица();

ако(пид== 0) {
getPIN(щифт); // генериране на ПИН
близо(pipefds[0]); // затваряне на четене fd
пиши(pipefds[1],щифт,PIN_LENGTH+ 1); // запис на ПИН в тръба

printf („Генериране на ПИН в дете и изпращане на родител ...н');

сън(PIN_WAIT_INTERVAL); // умишлено забавяне на генерирането на ПИН.

изход (EXIT_SUCCESS);
}

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

близо(pipefds[1]); // затваряне на запис fd
Прочети(pipefds[0],буфер,PIN_LENGTH+ 1); // четене на PIN от тръбата
близо(pipefds[0]); // затваряне на четене fd
printf („Родителят е получил ПИН код„%s “от дете.нн',буфер);
}
}

връщанеEXIT_SUCCESS;
}

Този пример е същият като Пример 3 . Единствената разлика е, че тази програма непрекъснато създава потомствен процес, генерира ПИН код в дочерния процес и изпраща ПИН кода на родителския процес, използвайки канал.

След това родителският процес чете ПИН кода от тръбата и го отпечатва.

Тази програма генерира нов PIN_LENGTH PIN на всеки PIN_WAIT_INTERVAL секунди.

Както можете да видите, програмата работи според очакванията.

Можете да спрете програмата само с натискане + ° С .

Така че, по този начин използвате системния извикване pipe () в езика за програмиране на C. Благодаря, че прочетохте тази статия.