Systemy zgodne z POSIX (w większości Linux, OS X, BSD, i inne typu z/OS, Solaris) dzielą to na dwie czynności. Na początku należy wywołać funkcję fork(), która powoduje duplikację procesu. Funkcja ta po wykonaniu zwraca pewną wartość. Będąc w procesie rodzica, jest to identyfikator procesu uruchomionego (pid). W procesie dziecka jest zwracana wartość 0. Wszystkie procesy w systemach Uniksowych są uruchamiane po procesie init, który uruchamia system. Proces init ma identyfikator równy 1. Z tego powody można jednoznacznie stwierdzić, że jeżeli wartość zwracana z fork() równa się 0, to jest to proces dziecka. Ale jak faktycznie użyć tej funkcji? Przykład w c poniżej:
Kod: Zaznacz cały
//Język: c, c++
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
pid_t pid; // Identyfikator procesu, jest to w zasadzie alias na typ całkowity, nieujemny.
pid = fork(); // Zmiena pid od teraz przechowuje wartość zwróconą przez fork().
// Od tego momentu program działą na dwóch procesach.
// Jeżeli pid != 0, to warunek będzie spełniony.
if (pid) {
printf("Jestem w procesie ojca, a mój PID, to %d", getpid());
}
else {
printf("Jestem w procesie dziecka, a mój PID, to %d.\n", getpid());
}
return 0;
}
Należy pamiętać, że nowy proces otrzymuje kopię wszystkich zmiennych istniejących w momencie tworzenia procesu. Z tego powodu modyfikacje zmiennych w jednym procesie nie zmieniają wartości tych samych zmiennych w drugim. Aby pamięć była współdzielona, potrzeba innych narzędzi, jednakże nie leżą one w zakresie tego poradnika
Kiedyś prawdopodobnie opiszę jak dodatkowo użyć funkcji z rodziny exec służących do zastąpienia obecnego procesu przez inny, a także funkcji wait() oraz waitpid().
Źródła:
Advanced Linux Programming
Beej's Guide to UNIX IPC
man fork
Własna wiedzia i doświadczenie.