fork() - ett systemanrop i Unix-liknande operativsystem som skapar en ny process (underordnad), vilket är en nästan komplett kopia av den överordnade processen som gör detta anrop.
Begreppet processforking beskrevs första gången 1962 av Melvin Conway och implementerades i form av ett systemanrop i Project Genie 1964 , varifrån det lånades av Thompson när Unix implementerades; samtalet inkluderades senare i POSIX- standarden .
Det finns skillnader mellan den underordnade processen som skapas av samtalet fork()och den överordnade processen:
Efter anropet gafflar fork() algoritmen vanligtvis (om funktionen lyckas fork()returnerar den PID för den underordnade processen till den överordnade processen och noll till den underordnade processen. Om den underordnade processens spawn misslyckas fork()returnerar funktionen -1).
Efter fork()att den underordnade processen oftast kör ett systemanrop exec()som läser in ett nytt program i processutrymmet (det är precis så, och bara på detta sätt, i ett Unix-system, startas programmet i en separat process). Så, den första (null) Unix-processen (kärnan i systemet) skapar en kopia av sig själv för att köra init (processen med PID = 1), vilket i sin tur skapar underordnade processer för att starta initieringen av systemet och terminalerna.
Vissa program skapar underordnade processer inte för att köra ett annat program, utan för att köra en parallell uppgift. Så agerar till exempel enkla nätverksservrar - när en klient ansluter skapar servern sin egen kopia (underprocess), som servar klientanslutningen och slutar när den stängs. Den överordnade processen fortsätter att vänta på nya anslutningar.
Samtalet fork()tar lång tid att slutföra eftersom det kräver mycket data för att kopieras. För att komma runt detta skapar vissa nätverksservrar (som Apache- och Lighttpd -webbservrarna ) underordnade processer i förväg för att minska serverns svarstid. Det finns också "lättvikts" implementeringar (till exempel i Linux-kärnan [1] ) som mappar överordnade minnessidor till en ny process istället för att kopiera dem (en ny sida skapas bara när dess innehåll ändras av en av processerna) , vilket avsevärt minskar tiden för att skapa en ny process ( kopiera-på-skriv- teknik ). fork()