pipe(), Unnamed Pipes

Kategori: Parallel Programming , 19 Ekim 2019 , JanFranco


Pipe, file descriptor'ları kullanarak iletişimi sağlayan bir yapıdır. File descriptor'lardan bahsetmek gerekirse, işletim sistemlerinde bir dosya açtığımız zaman file descriptor table adı verilen bir yapıda bir integer değer saklanır. Örneğin name1.txt adında bir dosya açtık. Bu dosyayı açtığımız için file descriptor table'a varsayalım ki 101 yazıldı. Daha sonra name2.txt adında bir dosya daha açtık. Bu durumda file descriptor table'a 102 yazıldı. Daha sonra name.txt dosyasındaki işlemimizi tamamladık ve kapattık. Bu durumda ise 101 yazısı silindi.

Bir pipe() fonksiyonu çağırıldığında, file descriptor return eder. Bu file descriptor'lardan biri pipe'ın bir ucu olan Write-End ucuna, diğeri ise pipe'ın diğer ucu olan Read-End ucuna bağlanır. Bir örnek üzerinden anlatmak gerekirse:


#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>

int main(void) {
	int pfds[2];
	char buf[30];
	
	if (pipe(pfds) == -1) {
		perror("pipe");
		exit(1);
	}
	
	printf("writing to file descriptor #%d\n", pfds[1]);
	write(pfds[1], "test", 5);
	printf("reading from file descriptor #%d\n", pfds[0]);
	read(pfds[0], buf, 5);
	printf("read \"%s\"\n", buf);
	
	return 0;
}
Burada öncelikle pipe için bir pfds dizisi oluşturduk. Daha sonra pipe fonksiyonunu çağırdık ve parametre olarak bu diziyi gönderdik. Hata kontrolü yaptık, eğer fonksiyondan return edilen değer -1 ise hata mesajı verdik ve programı sonlandırdık. Hata yoksa devam ettik ve "Writing to the file descriptor #" şeklinde bir mesaj verdik. Buradaki FILE DESCRIPTOR değeri pfds[1]'in içindeki değerdir. İşletim sistemi tarafından atanır. En yukarıdaki file descriptor örneğindeki 101 sayısı gibi. Daha sonra bu file descriptor'ına "test" şeklinde bir kelime yazdık. Daha sonra "Reading from file descriptor #" şeklinde bir mesaj daha verdik. Buradaki FILE DESCRIPTOR değeri pfds[0]'ın içindeki değerdir. Yine aynı şekilde işletim sistemi tarafından verilmiştir. Burada pipe fonksiyonunu kullandığımızdan, yazdığımız "text" yazısını bağlı olduğu descriptor'a yani pipe'ın Read-End kısmına aktardı ve biz de read() fonksiyonu ile bu yazıyı buf adını verdiğimiz diziye atadık. Son olarak buf dizisini ekrana bastırdık.


Sonraki Yazı: fork() and pipe()
Yorumlar

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