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