LABORATORIUM 11


FUNKCJA FORK()

Funkcja fork() w języku ANSI C służy do tworzenia nowych procesów współbieżnych. Nowo utworzony proces nazywamy procesem potomnym, a proces w którym wywołujemy fork() procesem rodzicielskim. Przypomnij sobie zad. 3 z laboratorium 9.

UWAGA: Przed uruchomieniem każdego z poniższego kodu postaraj się przewidzieć jego rezultat. Nastepnie skompiluj i uruchom program.

Program 1
Nowo tworzony proces wykonuje kod od momentu instrukcji fork().
#include <stdio.h>
#include <sys/types.h> 
#include <unistd.h> 

int main(){ 

	printf("To ja główny proces");
 	  
    	fork(); // po tej instrukcji wspołbieżnie zostaje uruchomiony proces z kodem znajdującym się poniżej
  
    	printf("To ja proces potomny lub rodzicielski"); 

    	return 0; 
}

Program 2
Procesy potomne również mogą tworzyć prcoesy potomne wobec siebie.
#include <stdio.h>
#include <sys/types.h> 
#include <unistd.h> 

int main(){ 
  
    	fork();
	fork();
	fork();
  
    	printf("Cześć!"); 

    	return 0; 
}

Program 3
Funkcja fork() zwraca liczbę ujemną, w razie błędu, w przeciwnym wypadku 0 do procesu potomnego, a ID procesu potomka do rodzica.
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
   
int main(){

	int zm = fork();

	if (zm < 0) printf("Coś poszło nie tak");
	else if (zm==0) printf("To ja proces potomny %d\n", getpid());
	else printf("To ja proces rodzicielski %d\n", getpid());

        return 0;
}

Program 4
Funkcja wait() powoduje czekanie procesu rodzicielskiego na zakończenie procesu potomnego.
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
 
int main()
{
    	pid_t cpid;
   	if (fork()== 0)
        	exit(0);           // zakończenie działania procesu potomnego
    	else	cpid = wait(NULL); // wait() zwraca id porcesu zakonczonego potomnego
   	printf("Parent pid = %d\n", getpid());
    	printf("Child pid = %d\n", cpid);
 
    return 0;
}



Zadanie
Korzystając m.in. z funkcji wait() (proszę przeczytać manuale), proszę napisać program w ANSI C, który będzie pobierał od użytkownika liczbę całkowitą, wpisze ją do pliku, uruchomi proces potomny i będzie czekał aż zakończy on działanie. Drugi proces (potomny) pobierze z tego pliku liczbę, obliczy jej sześcian i wypisze na ekranie.