Wprowadzenie do procesów w systemach POSIX

Awatar użytkownika
enedil
Terminator
Terminator
Posty: 1306
Rejestracja: 08 wrz 2012, 16:54
Płeć: Mężczyzna
Wersja Ubuntu: 16.04
Środowisko graficzne: Unity
Architektura: x86_64
Kontakt:

Wprowadzenie do procesów w systemach POSIX

Post autor: enedil » 17 mar 2015, 22:20

Zapewne część z was kiedyś się zastanawiała w jaki sposób tworzyć nowe procesy z aplikacji, którą piszecie.

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;
}
To wystarcza, by powstały dwa różne procesy, które są uruchamiane w jednym programie.
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.
Dobrze jest, psiakrew, a kto powie, że nie, to go w mordę!

~moderatorzy
ODPOWIEDZ

Wróć do „Software-Inne”