Jonny Karlsson PROCESSPROGRAMMERING Föreläsning 3 ( ) Innehåll: -Processtruktur -Processklyvning och kodbyte -Avslutning av processer -Processynkronisering
Jonny Karlsson Processtruktur Två olika processtyper i Unix: Huvudprocess-Föräldraprocess-Master Slavprocess-Barnprocess-Slave En föräldraprocess kan ha flera barnprocesser och en barnprocess endast en föräldraprocess
Jonny Karlsson Processtruktur Alla öppna processer identifieras med en unik process-ID (PID) Specialprocesser: PIDAnvänds avFunktion 0kernel Systemprocessen 1initSköter om uppstart av Unix systemet efter ”reboot” 2pagedaemonAnsvarar för sökning i det virtuella minnessystemet pid_t getpid(void)returnerar nuvarande processens PID pid_t getppid(void)returnerar föräldraprocessens PID (1)
Jonny Karlsson Processklyvning Systemanropet fork() används i Unix för att starta upp en ny process från en innevarnade process. (kloning av en process).
Jonny Karlsson Processklyvning pid_t fork (void) Öppnar en ny paralell process (barnprocess) som blir en fullständig kopia av förälderprocessen. Båda processerna fortsätter exekveringen som normalt genast efter fork() anropet. fork() funktionen returnerar ett heltal (pid_t) som kan ha följande värden: -1 =Error 0 = Barnprocess OK till barnprocessen >1=Barnprocessens PID till Föräldraprocessen fork() anropas en gång men returnerar två gånger. Barnprocessen mottar en nolla eftersom en barnprocess inte kan ha fler än en förälderprocess Förälderprocessen mottar den uppstartade barnprocessens PID, eftersom en förälder kan ha flera barnprocesser (2)
Jonny Karlsson Kodbyte Med kodbyte menas uppstart och exekvering av ett programkod lagrat i en annan programfil. Används vanligtvis genast efter processklyvning (fork) och startar upp ett program som skall exekveras av barnprocessen. Funktioner för kodbyte: - execl(), execv(), execle(), execve(), execlp(), execvp() Se manualfilerna (man) int execl(char *name, char *arg1, char *arg2,...., char *argn, 0); namepekare på programkodens filnamn arg1pekare på teckensträng för uppstart av programkoden arg2pekare på parameter 1 arg2pekare på parameter 2 arg2... Sista parameterAlltid 0 (3)
Jonny Karlsson Avslutning av processer En process avslutas vanligen med exit(), return() eller _exit() kommondot i programmets main() funktion. void exit(int status) void _exit(int status) void return(int status) Dessa funktioner berättar för föräldraprocessen hur barnprocessen avslutats. status = 0vid normal processavslutning status = felkodvid processavslutning som förorsakats av ett fel. (4)
Jonny Karlsson Processynkronisering En föräldraprocess kan vänta på avslutning av en barnprocess med systemanropen wait() eller waitpid() pid_t wait (int *status); pid_t waitpid(pid_t pid, int *status, int options) se man fil pid_t Den avslutade barnprocessens PID statusEtt heltalsvärde som hänvisar till barnprocessens ”exit kod” Funktionerna wait() och waitpid() kan vid anropet reagera på tre olika sätt: 1.blockerar föräldraprocessen ifall barnprocessen fortfarande är aktiv 2.returnarar omeldelbart slutstatus från en redan avslutad barnprocess 3.returnerar omedelbart ett felmeddelande ifall föräldern inte har någon barprocess att vänta på (5)
Jonny Karlsson Processynkronisering status kan analyseras med ett antal makron definierade i sys/wait.h: WIFEXITED(status), WEXITSTATUS(status), WIFSIGNALED(status), WTERMSIG(status), WIFSTOPPED(status), WSTOPSIG(status) (se man wait för mera info) exempel: WEXITSTATUS(status)Returnerar barnprocessens ”exit kod” (6)