fork() and pipe()

Kategori: Parallel Programming , 19 Ekim 2019 , JanFranco


Bir önceki yazımda pipe'ın nasıl kullanılacağından bahsetmiştim. Bu yazımda fork() ve pipe() fonksiyonlarının birlikte nasıl kullanılacağını anlatmaya çalışacağız. Örnek üzerinden gidelim:


#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <unistd.h>

int main(void) {
	
	int pfds[2];
	char buf[30];
	
	pipe(pfds);
	
	if (!fork()) {
		printf(" CHILD: writing to the pipe\n");
		write(pfds[1], "test", 5);
		printf(" CHILD: exiting\n");
		exit(0);
	} else {
		printf("PARENT: reading from pipe\n");
		read(pfds[0], buf, 5);
		printf("PARENT: read \"%s\"\n", buf);
		wait(NULL);
	}
	
	return 0;
}
İlk olarak pipe işlemi için pfds ve buf adında biri int, diğeri char veri tipinde olmak üzere iki adet dizi tanımladık. Daha sonra pipe() fonksiyonunu çağırdık ve argüman olarak pfds dizisini gönderdik. Daha sonra fork işlemi için fork() fonksiyonunu çağırdık. Bu kısım bütün bu olayın özüdür. fork fonksiyonunu çağırdığımızda tüm kodlarla birlikte file descriptor'lar da kopyalanmaktadır. Yani parent process'te okuma ve yazma işlemleri 101 ve 102 numaralı file descriptor'lar varsa, child process'te de aynı numaralara sahip file descriptorlar bulunmaktadır. Zaten child process'te farklı numaralar olsaydı, process'ler arası haberleşme mümkün olmazdı. Daha sonra fork() işlemi için if else bloğu açtık. Parent process'in fork değeri 0'dan farklı olacağı için else bloğunu, child process if bloğunu çalıştıracaktır. Child process ve parent process aynı anda işlemlere başlar. Parent process burada okuma işlemi için beklerken, child process yazma işlemini gerçekleştirir. Yazma işlemi bittiğinde parent process bunu okur. Parent process işlemini bitirmek için wait() fonksiyonu nedeniyle child process'i bekler. Child process exit() fonksiyonu ile işlemini sonlandırdığında parent process de işlemini bitirir ve program sonlanır.


Sonraki Yazı: FIFOs, Named Pipes
Yorumlar

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