C Програмиране

Системно обаждане в тръба в C

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

Всичко за тръбата () Функция:

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

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. Благодаря, че прочетохте тази статия.

Инсталирайте най-новия Dolphin Emulator за Gamecube & Wii на Linux
Dolphin Emulator ви позволява да играете избраните от вас игри Gamecube & Wii на Linux Personal Computers (PC). Като безплатно достъпен и емулатор на...
Как да използвам GameConqueror Cheat Engine в Linux
Статията обхваща ръководство за използването на GameConqueror cheat engine в Linux. Много потребители, които играят игри под Windows, често използват ...
Най-добрите емулатори на игрови конзоли за Linux
Тази статия ще изброи популярния софтуер за емулация на игрова конзола, наличен за Linux. Емулацията е слой за софтуерна съвместимост, който емулира х...