CodeBlanks Logo Icon CodeBlanks

FIFO

  • C kursu
  • İleri seviye
  • Ders 32/83
  • 5 dk

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");.

Başlangıç kodu

main.c
#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <sys/wait.h>

// FIFO kur
// fork ile çocuk okusun
// ebeveyn yazsın ve beklesin

int main(void) {
    return 0;
}

Örnek çözüm

main.c
#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;
}

Beklenen çıktı

fifo

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 FIFO parçalarını eşle

Kavram Anlamı
mkfifo FIFO oluşturur
open FIFO'yu açar
read Veri okur
unlink FIFO'yu siler

2 mkfifo çağrısının ikinci parametresi nedir?

  • Bayt sayısı
  • Süreç kimliği
  • Dosya tanıtıcı
  • Erişim izinleri Doğru cevap

Açıklama: İkinci parametre mode, erişim izinleridir (ör. 0644).

3 mkfifo çağrısı

Soru
mkfifo("/tmp/cb_fifo", ____);
Cevap
mkfifo("/tmp/cb_fifo", 0644);

Açıklama: 0644 okuma-yazma izinlerini verir.

İleri seviye bölümündeki tüm dersler