1. Cel laboratorium
Celem ćwiczeń było zapoznanie się z podstawami tworzenia i zarządzania procesami.
2. Przebieg laboratorium
* zadanie 3 i 4
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
//zadanie 3 i 4
main(){
int childpid;
int status=1;
int zakonczono;
printf("startuje proces macierzysty pid %d\n",getpid());
if ((childpid = fork()) == -1){
perror("nie moge forknac");
exit(1);
}else if(childpid == 0){//dziecko
sleep(10);
printf("Proces potomny: %d\n", getpid());
exit(1);
}else{//rodzic
int status=0;
int pid = wait(&status);
printf("Proces rodzica, zamknieto: %d, status: %d\n", pid, WEXITSTATUS(status));
}
exit(0);
}
* zadanie 5
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
//zadanie 5
main(){
int childpid;
int status=1;
int pid;
printf("startuje proces macierzysty pid %d\n",getpid());
int i;
for(i=0; i<5; i++){
if ((childpid = fork()) == -1){
perror("nie moge forknac");
exit(1);
}else if(childpid == 0){//dziecko
sleep(10);
exit(2);
}
}
for(i=0; i<5; i++){
pid = wait(&status);
printf("zamknieto: %d, status: %d\n", pid, WEXITSTATUS(status));
}
exit(0);
}
* zadanie 6
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
//zadanie 6
main(){
int childpid;
int status=1;
int pid;
printf("startuje proces macierzysty pid %d\n",getpid());
int i;
for(i=0; i<5; i++){
if ((childpid = fork()) == -1){
perror("nie moge forknac");
exit(1);
}else if(childpid == 0){//dziecko
sleep(4);
continue;
}else{
printf("Proces potomny o pidzie %d z rodzica %d\n",getpid(),getppid());
wait(&status);
break;
}
}
exit(0);
}
*zadanie 7
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <signal.h>
//zadanie 7
void oblsluga_zakonczenia_dziecka(int nr_sig)
{
printf("Rodzic już się dowiedział o zakończeniu procesu %d\n",wait(NULL));
}
main(){
int childpid;
int status=1;
int pid;
printf("startuje proces macierzysty pid %d\n",getpid());
if ((childpid = fork()) == -1){
perror("nie moge forknac");
exit(1);
}else if(childpid == 0){//dziecko
printf("potomek %d\n", getpid());
sleep(4);
exit(2);
}else{
signal(SIGCHLD,oblsluga_zakonczenia_dziecka);
sleep(6);
}
exit(0);
}
3. Wnioski
Po wykonaniu powyższych zadań poznaliśmy z zasadę działania funkcji fork, wait oraz signal. Najbardziej problematycznym zadaniem było zadanie nr 5 gdzie należało stworzyć 5 gdzie każdy nowy proces tworzył własny proces potomny.