C
FIFO
FIFO (named pipe) ile isimli pipe öğrenirsin.
FIFO nedir?
FIFO (named pipe), dosya sisteminde bir yola sahip özel bir dosyadır. Adından da anlaşılacağı gibi First-In First-Out sırasıyla veri taşır. mkfifo(path, mode) ile oluşturulur; <sys/stat.h> ve <sys/types.h> başlıklarını gerektirir.
Anonim pipe yalnızca akraba süreçlerde çalışır; FIFO ise rastgeu iki sürece açıktır çünkü yol üzerinden bulunur. open ile açılır, read ve write ile kullanılır. Yazıcı açılana kadar open okuma kipinde bekler; bu yüzden fork deseni test için uygundur.
open ve fork deseni
FIFO'yu open(path, O_RDONLY) ile okuma, open(path, O_WRONLY) ile yazma kipinde açarsın. İki taraf da open çağırana kadar çağrı bloklanır; bu otomatik eşleşme test için idealdir.
fork ile çocuk okuyucu, ebeveyn yazıcı olabilir. Ebeveyn write(fd, "fifo", 4) ile yazar, çocuk read(fd, buf, 4) ile okur. İş bitince close(fd) ve son olarak unlink(path) ile FIFO dosyası silinir. wait(NULL) ile çocuk toplanır.
Uygulama FIFO ile veri aktar
unlink("/tmp/cb_fifo"); mkfifo("/tmp/cb_fifo", 0644); ile FIFO kur. pid_t pid = fork(); ile çocuk oluştur. Çocukta int fd = open("/tmp/cb_fifo", O_RDONLY);, char buf[16]; memset(buf, 0, sizeof(buf));, read(fd, buf, 4);, printf("%s\n", buf);, close(fd); _exit(0);. Ebeveynde int fd = open("/tmp/cb_fifo", O_WRONLY);, write(fd, "fifo", 4);, close(fd);, wait(NULL);, unlink("/tmp/cb_fifo");.
Örnek çözümü göster
#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <sys/wait.h>
int main(void) {
unlink("/tmp/cb_fifo");
mkfifo("/tmp/cb_fifo", 0644);
pid_t pid = fork();
if (pid == 0) {
int fd = open("/tmp/cb_fifo", O_RDONLY);
char buf[16];
memset(buf, 0, sizeof(buf));
read(fd, buf, 4);
printf("%s\n", buf);
close(fd);
_exit(0);
}
int fd = open("/tmp/cb_fifo", O_WRONLY);
write(fd, "fifo", 4);
close(fd);
wait(NULL);
unlink("/tmp/cb_fifo");
return 0;
}
Kendini test et
-
FIFO parçalarını eşle
- mkfifo
- FIFO oluşturur
- open
- FIFO'yu açar
- read
- Veri okur
- unlink
- FIFO'yu siler
-
mkfifo çağrısının ikinci parametresi nedir?
- Bayt sayısı
- Süreç kimliği
- Dosya tanıtıcı
- Erişim izinleri
Cevabı göster
Erişim izinleri — İkinci parametre mode, erişim izinleridir (ör. 0644).
-
mkfifo çağrısı
mkfifo("/tmp/cb_fifo", ____);
Cevabı göster
mkfifo("/tmp/cb_fifo", 0644);
Sıradaki ders: Shared memory