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

Системно обаждане на вилица в C

Системно обаждане на вилица в C
fork () системното повикване се използва за създаване на дъщерни процеси в програма на C. fork () се използва, когато във вашето приложение се изисква паралелна обработка. Системната функция fork () е дефинирана в заглавките sys / видове.з и unistd.з. В програма, в която използвате вилица, трябва да използвате и системно повикване wait (). wait () системното повикване се използва за изчакване в родителския процес за завършване на дъщерния процес. За да завърши дъщерния процес, се използва системното повикване exit () в дъщерния процес. Функцията wait () е дефинирана в заглавката sys / изчакайте.з и функцията exit () е дефинирана в заглавката stdlib.з.

Фигура 1: Основен работен процес на fork ()

В тази статия ще ви покажа как да използвате fork () системно извикване за създаване на дъщерни процеси в C. И така, нека започнем.

fork () Синтаксис и върната стойност:

Синтаксисът на системната функция fork () е както следва:

pid_t fork (void);

Системната функция fork () не приема никакъв аргумент. Връща цяло число от типа pid_t.

При успех, fork () връща PID на дъщерния процес, който е по-голям от 0. Вътре в дъщерния процес връщаната стойност е 0. Ако fork () не успее, тогава връща -1.

Обикновена вилица () Пример:

Прост пример за fork () е даден по-долу:

#include
#include
#include
#include
#include
 
int main (void)
pid_t pid = вилица ();
 
ако (pid == 0)
printf ("Child => PPID:% d PID:% d \ n", getppid (), getpid ());
изход (EXIT_SUCCESS);

иначе ако (pid> 0)
printf ("Родител => PID:% d \ n", getpid ());
printf ("Изчаква се процесът на деца да завърши.\н");
изчакайте (NULL);
printf ("Процесът на детето завърши.\н");

друго
printf ("Не може да се създаде дъщерен процес.\н");

 
връщане EXIT_SUCCESS;

Тук използвах fork (), за да създам дъщерен процес от основния / родителския процес. След това отпечатах PID (идентификатор на процеса) и PPID (идентификатор на процес на родител) от процес на дете и родител. В родителския процес чакането (NULL) се използва за изчакване на завършването на дъщерния процес. В дъщерния процес се използва exit (), за да завърши дъщерния процес. Както можете да видите, PID на родителския процес е PPID на дъщерния процес. И така, процесът на детето 24738 принадлежи на родителския процес 24731.

Можете също да използвате функции, за да направите програмата си по-модулна. Ето, използвах processTask () и parentTask () функции за процесите дете и родител съответно. Ето как всъщност се използва fork ().

#include
#include
#include
#include
#include
 
void childTask ()
printf ("Hello World \ n");

 
void parentTask ()
printf ("Основна задача.\н");

 
int main (void)
pid_t pid = вилица ();
 
ако (pid == 0)
childTask ();
изход (EXIT_SUCCESS);

иначе ако (pid> 0)
изчакайте (NULL);
parentTask ();

друго
printf ("Не може да се създаде дъщерен процес.");

 
връщане EXIT_SUCCESS;

Резултатът от горната програма:

Изпълнение на множество дъщерни процеси с помощта на fork () и Loop:

Можете също да използвате цикъл, за да създадете толкова дъщерни процеси, колкото са ви необходими. В примера по-долу създадох 5 дъщерни процеса, използвайки for цикъл. Също така отпечатах PID и PPID от дъщерните процеси.

#include
#include
#include
#include
#include
 
int main (void)
за (int i = 1; i <= 5; i++)
pid_t pid = вилица ();
 
ако (pid == 0)
printf ("дъщерен процес => PPID =% d, PID =% d \ n", getppid (), getpid ());
изход (0);

друго
printf ("Родителски процес => PID =% d \ n", getpid ());
printf ("В очакване на завършване на дъщерни процеси ... \ n");
изчакайте (NULL);
printf ("дъщерният процес приключи.\н");


 
връщане EXIT_SUCCESS;

Както можете да видите, идентификаторът на родителски процес е еднакъв във всички дъщерни процеси. И така, всички те принадлежат на един и същ родител. Те също така изпълняват по линеен начин. Един след друг. Контролът на детските процеси е сложна задача. Ако научите повече за системното програмиране на Linux и как работи, ще можете да контролирате потока на тези процеси, както искате.

Пример от реалния живот:

Различните сложни математически изчисления като md5, sha256 и т.н. генерирането на хеш изисква много процесорна мощ. Вместо да изчислявате подобни неща в същия процес като основната програма, можете просто да изчислите хеша на дъщерния процес и да върнете хеша в основния процес.

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

#include
#include
#include
#include
#include
 
int getPIN ()
// използвайте PPID и PID като семе
srand (getpid () + getppid ());
int secret = 1000 + rand ()% 9000;
връщаща тайна;

 
int main (void)
int fd [2];
тръба (fd);
pid_t pid = вилица ();
 
ако (pid> 0)
затваряне (0);
затваряне (fd [1]);
дуп (fd [0]);
 
int secretNumber;
size_t readBytes = read (fd [0], & secretNumber, sizeof (secretNumber));
 
printf ("В очакване на ПИН ... \ n");
изчакайте (NULL);
printf ("Прочетени байтове:% ld \ n", readBytes);
printf ("ПИН:% d \ n", секретен номер);

иначе ако (pid == 0)
затваряне (1);
затваряне (fd [0]);
дуп (fd [1]);
 
int secret = getPIN ();
write (fd [1], & secret, sizeof (secret));
изход (EXIT_SUCCESS);

 
връщане EXIT_SUCCESS;

Както можете да видите, всеки път, когато стартирам програмата, получавам различен 4-цифрен ПИН код.

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

Най-добрите игри за игра с ръчно проследяване
Oculus Quest наскоро представи страхотната идея за ръчно проследяване без контролери. С непрекъснато нарастващия брой игри и дейности, които изпълнява...
Как да покажете OSD наслагване в приложения на цял екран за Linux и игри
Играта на цял екран или използване на приложения в режим на цял екран без разсейване може да ви откъсне от съответната системна информация, видима в п...
Топ 5 карти за залавяне на игри
Всички сме виждали и обичаме поточни игри в YouTube. PewDiePie, Jakesepticye и Markiplier са само някои от най-добрите геймъри, които са спечелили мил...