FIFOs, Named Pipes

Kategori: Parallel Programming , 19 Ekim 2019 , JanFranco


Önceki yazılarımda pipe kavramından bahsettim. Daha doğrusu unnamed pipe kavramından bahsettim diyelim. Bu yazımda FIFO'lardan yani named pipe'lardan bahsedeceğim. Unnamed pipe'larda bir fork() işlemi yapılmalı. Çünkü oluşan file descriptor'lar iki process'te de aynı olmalı ki bir iletişim sağlanabilsin. Named pipe'larda ise böyle bir şeye ihtiyaç yoktur. Çünkü pipe'ın bir adı vardır ve herhangi bir process bu pipe'a erişebilir ve okuma/yazma işlemlerini gerçekleştirebilir. Örnek üzerinden görelim:


speak.c file:

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

#define FIFO_NAME "american_maid"

int main(void) {

	char s[300];
	int num, fd;

	mknod(FIFO_NAME, S_IFIFO | 0666, 0);

	printf("waiting for readers...\n");
	fd = open(FIFO_NAME, O_WRONLY);
	printf("got a reader--type some stuff\n");

	while (fgets(s, sizeof s, stdin), !feof(stdin)) {
		if ((num = write(fd, s, strlen(s))) == -1)
			perror("write");
		else
			printf("speak: wrote %d bytes\n", num);
	}

	return 0;
}
Okuma/yazma işlemleri için s adında char tipinde bir dizi ve integer tipinde bir değişken tanımladık. Dosya açma işlemi için de yine integer tipinde bir değişken olan fd'yi tanımladık. mknod() fonksiyonu ile bir FIFO oluşturduk. Parametre olarak bir isim ve dosya izinlerini verdik. Daha sonra open() fonskiyonu ile oluşturduğumuz FIFO'yu açtık. Argüman olarak FIFO ismini ve ne işlem yapacağımızı söyledik. O_WRONLY yazarak sadece yazma işlemi yapacağımızı söyledik. Daha sonra fgets() fonksiyonu ve while döngüsü ile yazma işlemini gerçekleştirdik. Şimdi okuma yapacak olan dosyamızın kodlarını inceleyelim:


tick.c file:

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

#define FIFO_NAME "american_maid"

int main(void)
{
	char s[300];
	int num, fd;

	mknod(FIFO_NAME, S_IFIFO | 0666, 0);

	printf("waiting for writers...\n");
	fd = open(FIFO_NAME, O_RDONLY);
	printf("got a writer\n");

	do {
		if ((num = read(fd, s, 300)) == -1)
			perror("read");
		else {
			s[num] = '\0';
			printf("tick: read %d bytes: \"%s\"\n", num, s);
		}
	} while (num > 0);

	return 0;
}
speak.c dosyasında yaptıklarımızın hemen hemen aynısını yaptık. Bu sefer FIFO'yu açarken O_RDONLY flag'ini kullandık. Daha sonra döngüyle okuma işlemini yaptık. Bu iki dosya ayrı terminallerde build edilip çalıştırıldığında bir process yazarken diğer process okuma işlemi yapacaktır.


Sonraki Yazı: File Locking, Setting and Clearing a Lock
Yorumlar

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