Всичко за тръбата () Функция:
Синтаксисът на тръба() функцията е:
int тръба (int pipefd [2]);Тук функцията pipe () създава еднопосочен канал за данни за комуникация между процесите. Предавате в инт Масив от тип (Integer) pipefd състоящ се от 2 елемента масив към функционалната тръба (). След това функцията pipe () създава два файлови дескриптора в pipefd масив.
Първият елемент на pipefd масив, pipefd [0] се използва за четене на данни от тръбата.
Вторият елемент на pipefd масив, pipefd [1] се използва за запис на данни в тръбата.
При успех функцията pipe () връща 0. Ако възникне грешка по време на инициализацията на тръбата, тогава функцията pipe () връща -1.
Функцията pipe () е дефинирана в заглавката unistd.з. За да използвате функцията pipe () във вашата програма на C, трябва да включите заглавката unistd.з както следва:
#includeЗа повече информация относно системната функция pipe (), проверете ръководството на pipe () със следната команда:
$ man 2 тръбаСтраницата на man на pipe ().
Пример 1:
За първия пример създайте нов изходен файл на C 1_пайп.° С и въведете следните редове кодове.
#include#include
#include
int main (void)
int pipefds [2];
if (pipe (pipefds) == -1)
perror ("тръба");
изход (EXIT_FAILURE);
printf ("Стойност на дескриптора на файла:% d \ n", pipefds [0]);
printf ("Стойност на дескриптора на файла:% d \ n", pipefds [1]);
връщане EXIT_SUCCESS;
Тук включих заглавния файл на pipe () unistd.з първо със следния ред.
#includeСлед това в главен () функция, дефинирах pipefds двуелемен цяло число масив със следния ред.
int pipefds [2];След това стартирах функцията pipe (), за да инициализирам масива с файлови дескриптори pipefds както следва.
тръба (pipefds)Също така проверих за грешки, използвайки връщаната стойност на функцията pipe (). Използвах изход () функция за терминал на програмата в случай, че функцията на тръбата откаже.
if (pipe (pipefds) == -1)perror ("тръба");
изход (EXIT_FAILURE);
След това отпечатах стойността на дескрипторите на файл за четене и запис pipefds [0] и pipefds [1] съответно.
printf ("Стойност на дескриптора на файла:% d \ n", pipefds [0]);printf ("Стойност на дескриптора на файла:% d \ n", pipefds [1]);
Ако стартирате програмата, трябва да видите следния изход. Както можете да видите, стойността на дескриптора на файла за прочетена тръба pipefds [0] е 3 и напишете дескриптор на файл на тръба pipefds [1] е 4.
Пример 2:
Създайте друг изходен файл на C 2_пайп.° С и въведете следните редове кодове.
#include#include
#include
#include
int main (void)
int pipefds [2];
буфер за символи [5];
if (pipe (pipefds) == -1)
perror ("тръба");
изход (EXIT_FAILURE);
char * pin = "4128 \ 0";
printf ("Писане на ПИН в тръба ... \ n");
запис (pipefds [1], щифт, 5);
printf ("Готово.\ n \ n ");
printf ("Четене на ПИН от тръба ... \ n");
четене (pipefds [0], буфер, 5);
printf ("Готово.\ n \ n ");
printf ("ПИН от тръба:% s \ n", буфер);
връщане EXIT_SUCCESS;
Тази програма основно ви показва как да пишете в тръбата и да четете данните, които сте записали от тръбата.
Тук запазих 4-знаков ПИН код в char масив. Дължината на масива е 5 (включително символа NULL \ 0).
char * pin = "4128 \ 0";Всеки ASCII знак е с размер 1 байт в C. Така че, за да изпратите 4-цифрения ПИН през тръбата, трябва да напишете 5 байта (4 + 1 NULL символ) от данни в тръбата.
За да напишете 5 байта данни (щифт) в тръбата, използвах напиши () функция, използвайки дескриптора на файл за писмен канал pipefds [1] както следва.
запис (pipefds [1], щифт, 5);Сега, когато имам някои данни в тръбата, мога да ги чета от тръбата с помощта на Прочети() функция на дескриптора на файла за четене на тръба pipefds [0]. Както написах 5 байта данни (щифт) в тръбата, ще чета и 5 байта данни от тръбата. Прочетените данни ще се съхраняват в буфер символен масив. Тъй като ще чета 5 байта данни от тръбата, буфер символният масив трябва да е с дължина поне 5 байта.
Определих буфер символен масив в началото на главен () функция.
буфер за символи [5];Сега мога да прочета ПИН кода от тръбата и да го съхранявам в буфер масив със следния ред.
четене (pipefds [0], буфер, 5);След като прочетох ПИН-а от тръбата, мога да го отпечатам с помощта на printf () функционират както обикновено.
printf ("ПИН от тръба:% s \ n", буфер);След като стартирам програмата, правилния изход се показва, както можете да видите.
Пример 3:
Създайте нов изходен файл на C 3_пайп.° С като тип в следните редове кодове.
#include#include
#include
#include
#include
int main (void)
int pipefds [2];
овъглена * щифт;
буфер за символи [5];
if (pipe (pipefds) == -1)
perror ("тръба");
изход (EXIT_FAILURE);
pid_t pid = вилица ();
if (pid == 0) // в дъщерния процес
ПИН = "4821 \ 0"; // ПИН за изпращане
затваряне (pipefds [0]); // затвори четене fd
запис (pipefds [1], щифт, 5); // запис на ПИН в тръба
printf ("Генериране на ПИН в дете и изпращане на родител ... \ n");
сън (2); // умишлено забавяне
изход (EXIT_SUCCESS);
if (pid> 0) // в основния процес
изчакайте (NULL); // изчакайте да завърши процесът на детето
затваряне (pipefds [1]); // затваряне на запис fd
четене (pipefds [0], буфер, 5); // чете ПИН от тръба
затваряне (pipefds [0]); // затвори четене fd
printf ("Родителят получи ПИН '% s' \ n", буфер);
връщане EXIT_SUCCESS;
В този пример ви показах как да използвате тръбата за комуникация между процесите. Изпратих ПИН от дъщерния процес до родителския процес с помощта на тръба. След това прочетете ПИН от тръбата в родителския процес и го отпечатайте от родителския процес.
Първо, създадох дъщерен процес, използвайки функцията fork ().
pid_t pid = вилица ();След това, в процеса на дете (pid == 0), Написах ПИН кода с помощта на напиши () функция.
запис (pipefds [1], щифт, 5);След като ПИН кодът бъде записан в тръбата от дъщерния процес, родителският процес (pid> 0) прочетете го от тръбата с помощта на Прочети() функция.
четене (pipefds [0], буфер, 5);След това родителският процес отпечата ПИН кода с помощта printf () функционират както обикновено.
printf ("Родителят получи ПИН '% s' \ n", буфер);Както можете да видите, стартирането на програмата дава очаквания резултат.
Пример 4:
Създайте нов изходен файл на C 4_пайп.° С като тип в следните редове кодове.
#include#include
#include
#include
#include
#define PIN_LENGTH 4
#define PIN_WAIT_INTERVAL 2
void getPIN (char pin [PIN_LENGTH + 1])
srand (getpid () + getppid ());
щифт [0] = 49 + rand ()% 7;
за (int i = 1; i < PIN_LENGTH; i++)
щифт [i] = 48 + rand ()% 7;
щифт [PIN_LENGTH] = '\ 0';
int main (void)
докато (1)
int pipefds [2];
оцветяващ щифт [PIN_LENGTH + 1];
буфер за символи [PIN_LENGTH + 1];
тръба (pipefds);
pid_t pid = вилица ();
ако (pid == 0)
getPIN (щифт); // генериране на ПИН
затваряне (pipefds [0]); // затвори четене fd
запис (pipefds [1], pin, PIN_LENGTH + 1); // запис на ПИН в тръба
printf ("Генериране на ПИН в дете и изпращане на родител ... \ n");
сън (PIN_WAIT_INTERVAL); // умишлено забавяне на генерирането на ПИН.
изход (EXIT_SUCCESS);
ако (pid> 0)
изчакайте (NULL); // чака детето да приключи
затваряне (pipefds [1]); // затваряне на запис fd
четене (pipefds [0], буфер, PIN_LENGTH + 1); // чете ПИН от тръба
затваряне (pipefds [0]); // затвори четене fd
printf ("Родителят получи ПИН '% s' от дете.\ n \ n ", буфер);
връщане EXIT_SUCCESS;
Този пример е същият като Пример 3. Единствената разлика е, че тази програма непрекъснато създава дъщерен процес, генерира ПИН в дъщерния процес и изпраща ПИН на родителския процес с помощта на тръба.
След това родителският процес чете ПИН от тръбата и го отпечатва.
Тази програма генерира нов PIN_LENGTH PIN на всеки PIN_WAIT_INTERVAL секунди.
Както можете да видите, програмата работи според очакванията.
Можете да спрете програмата само с натискане
И така, по този начин използвате системния разговор pipe () в езика за програмиране C. Благодаря, че прочетохте тази статия.