U biti je proces kontejner za skup resursa koji predstavljaju instancu trenutno pokrenutog programa. Notepad.exe je jedan program, kad ga pokreneš npr. 5 puta to je 5 različitih procesa istog programa, svaki sa svojim unosom u OS-evoj tablici procesa, sa svojim zauzećem sistemskih resursa etc.
Proces se ne mora uopće sastojati od threadova - npr. tek pošto je kreiran i prije nego je glavna nit proces startana, ili nakon što je terminiran a neki drugi proces ima otvoren handle na njega (nije pozvao CloseHandle() nakon CreateProcess()), pa sve što se čuva jest unos u tablici procesa u kojem je procesov exit status i eventualno još neke informacije ukoliko je bio pokrenut unutar JOB-a.
Mislim da je exit status procesa jednak exit statusu zadnjeg threada koji se terminirao na win, dok je na nekim platformama koje nemaju jasno definiranu dihotomiju proces/thread (npr. Linux gdje se task_struct koristi i za forkane procese i threadove) to malo drugačije.
Iznimka je ako je parent proces izašao prije childa, pa se onda nemaju kome čuvati te informacije. Na win postoji iznimka i za taj slučaj ukoliko je neki treći proces eksplicitno otvorio token od izašlog procesa sa OpenProcess().
Ukoliko C/C++ program eksplicitno ne vrati vrijednost u return-u iz main()-a
1) ili će kompajler to sam ubaciti kao defaultni parametar u ExitProcess(0)
2) ili će se program jednosavno vratiti natrag u OS sa "return" instrukcijom u ISA-i arhitekture platforme na kojoj se izvršava.
Slučaj 2 jest zanimljiv, pa iz njega slijedi da je najkraći win32 program onaj koji ima samo instrukciju "ret" (odnosno retn - return near).
U real-mode .COM programima stvar je još zabavnija, jer izvršni programi ne moraju imati headere za PE (Portable Executable) format, za sekcije, data directories (importe, relokacije..). Stoga slijedi da je najmanji mogući .COM fajl veličine 1 bajta sa sadržajem 0xC3 (opkod za ret). Pokušajte ga napraviti u hex editoru ;-)
Proces iz kojeg je program pozvan (njegov parent) jest obično shell (explorer.exe, bash, sh..). U UNIX modelu procesa je važno da svaki proces ima kakvog-takvog parenta, pa s vremena na vrijeme kernel prošara po listi aktivnih procesa i svima koji imaju parenta koji nije "među živima" dodijeli PID parent procesa na 1 (PID od init(1)). Kad se proces kojeg je init(1) tako formalno "naslijedio" terminira, init(1) poziva neku od wait*(2) fja da im uzme exit status. Na taj se način preventira najezda zombie procesa koji ne rade ništa pametno već samo čekaju da netko dođe i uradi wait*(2) na njih (da im Lara Croft u vidu init(1) odfikari entry u tablici procesa i olakša im unholy dušu).
[Ovu poruku je menjao cynique dana 06.05.2006. u 16:36 GMT+1]