fork()

Kategori: Parallel Programming , 18 Ekim 2019 , JanFranco


fork() işlemi bir alt process oluşturma işlemidir. fork() fonksiyonunu çalıştırdığımızda elimizde bir ana (parent) process bir de alt (child) process olur. Aşağıda bu işlemin kodları ve ne anlama geldiği yazılmıştır. Ancak Windows işletim sistemlerinde çalışmaya müsait değildir, Unix sistemlerde çalışır. Kodu inceleyelim:


#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
 
int main(void) {
 
	pid_t pid;
	int rv;
 
	switch(pid = fork()) {
		case -1:
			perror("fork"); /* something went wrong */
			exit(1); /* parent exits */
		case 0:
			printf(" CHILD: This is the child process!\n");
			printf(" CHILD: My PID is %d\n", getpid());
			printf(" CHILD: My parent's PID is %d\n", getppid());
			printf(" CHILD: Enter my exit status (make it small): ");
			scanf(" %d", &rv);
			printf(" CHILD: I'm outta here!\n");
			exit(rv);
		default:
			printf("PARENT: This is the parent process!\n");
			printf("PARENT: My PID is %d\n", getpid());
			printf("PARENT: My child's PID is %d\n", pid);
			printf("PARENT: I'm now waiting for my child to exit()...\n");
			wait(&rv);
			printf("PARENT: My child's exit status is: %d\n", WEXITSTATUS(rv));
			printf("PARENT: I'm outta here!\n");
	}
 
	return 0;
 
}
Burada switch bloğunda bir pid değişkeni mevcut. Bu değişken fork() fonksiyonundan geri dönen değeri saklar. 3 durum vardır. Ya 0 ya -1 ya da başka bir değer. Bu durumlara girmeden önce fork()'u biraz daha açıklamak gerekirse, fork() fonksiyonunu çağırıldığında, çağıran program parent process, oluşan yeni process, bu process'in yani kendisini çağıran process'in child process'idir. Parent process zaten yukarıdaki kodları çalıştırıyor. Burada bir problem yoktur. Ancak oluşan Child process de yukarıdaki kodları çalıştıracaktır. Burada hangisinin child hangisinin parent olduğunu ayırt etmek için fork() fonksiyonu bir değişken return eder. Bu değişken eğer 0 ise bu kodları çalıştıran process yeni oluşan CHILD process'tir. Eğer başka bir sayıysa PARENT process'tir. 3. durumda ise -1 olabilir. Bu hata durumudur ve ekrana hata mesajı bastırılır.

İki işlem oluştu ve ekrana pid bilgilerini bastılar. Şimdi program kullanıcıdan rastgele bir sayı bekliyor. Bu sayı girildiğinde Child process sonlanmış olur. Parent process'te, Child proces sonlanmadan önce My Child's exit status is: yazısı ekrana gelmez çünkü öncesinde bir wait fonksiyonu vardır.


Sonraki Yazı: pipe(), Unnamed Pipes
Yorumlar

Henüz bir yorum bulunmuyor.
Yorum bırakın