CodeBlanks Logo Icon CodeBlanks

Pipe

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

pipe ile süreçler arası tek yönlü veri akışını öğrenirsin.

Pipe nedir?

Pipe, akraba süreçler arasında tek yönlü veri akışı sağlayan anonim bir kanaldır. pipe(int fds[2]) çağrısı iki dosya tanıtıcı döndürür: fds[0] okuma, fds[1] yazma uçlarıdır.

Tipik desen şudur: önce pipe ile kanal oluşturulur, sonra fork ile çocuk süreç üretilir. Ebeveyn yazma üçünü, çocuk okuma üçünü kullanır; kullanmadıkları uçları close ile kapatırlar. Bu sayede write ve read ile veri akar. Pipe tamponlanmıştır; okuyucu bağlanana kadar write bekler.

fork ile pipe paylaşımı

fork çağrısı çocuğa ebeveynin tanıtıcı tablosunun bir kopyasını verir. Bu yüzden her iki süreç de aynı pipe uçlarına sahiptir. Kanalın tek yönlü kalması için ebeveyn okuma üçünü, çocuk yazma üçünü kapatır.

Ebeveyn write(fds[1], "merhaba", 7) ile yazar, çocuk read(fds[0], buf, 7) ile okur. read veri gelene kadar bekler; bu yüzden çıktı sıralaması garantilenir. İş bitince her iki taraf da kalan ucu kapatır; ebeveyn wait ile çocuğu toplar.

Uygulama Pipe ile mesaj gönder

int fds[2]; pipe(fds); ile kanal kur. pid_t pid = fork(); ile çocuk oluştur. Çocukta close(fds[1]);, char buf[16]; memset(buf, 0, sizeof(buf));, read(fds[0], buf, 7);, printf("%s\n", buf);, close(fds[0]); _exit(0);. Ebeveynde close(fds[0]);, write(fds[1], "merhaba", 7);, close(fds[1]);, wait(NULL);.

Başlangıç kodu

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

// pipe ile kanal kur
// fork ile çocuk oluştur, çocuk okusun
// ebeveyn yazsın ve wait ile beklesin

int main(void) {
    return 0;
}

Örnek çözüm

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

int main(void) {
    int fds[2];
    pipe(fds);
    pid_t pid = fork();
    if (pid == 0) {
        close(fds[1]);
        char buf[16];
        memset(buf, 0, sizeof(buf));
        read(fds[0], buf, 7);
        printf("%s\n", buf);
        close(fds[0]);
        _exit(0);
    }
    close(fds[0]);
    write(fds[1], "merhaba", 7);
    close(fds[1]);
    wait(NULL);
    return 0;
}

Beklenen çıktı

merhaba

Soru ve cevaplar

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

1 pipe(fds) çağrısından sonra fds[0] hangi amaçla kullanılır?

  • Hata kodu
  • Yazma ucu
  • Okuma ucu Doğru cevap
  • Süreç kimliği

Açıklama: fds[0] okuma, fds[1] yazma ucudur.

2 pipe çağrısı

Soru
int fds[2]; pipe(____);
Cevap
int fds[2]; pipe(fds);

Açıklama: pipe, fds dizisinin adresini alır ve iki ucu doldurur.

3 Pipe parçalarını eşle

Kavram Anlamı
pipe Kanal oluşturur
fork Süreç ikiye bölünür
fds[0] Okuma ucu
fds[1] Yazma ucu

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