0Pricing
C Academy · Ders

Boru Hatları

Üst-alt süreç iletişimi

Boru Hatları, CoddyKit'te ücretsiz bir C Academy dersidir. Bu, 4 dersinin 1. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, C Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. C Academy kursu toplamda 4 dersten oluşur.

Pipe Nedir

Pipe, birbiriyle ilişkili süreçler arasındaki tek yönlü iletişim kanalıdır. Bir süreç içine baytlar yazar, diğeri bunları dışarı okur; bu, veri taşıyan bir konveyör bandına benzer.

İki Dosya Tanımlayıcısı

pipe() çağrısı iki elemanlı bir diziyi doldurur: fd[0] okuma ucudur, fd[1] ise yazma ucudur. fd[1]'e yazılan veriler fd[0]'dan okunabilir.

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

int make_pipe(int fd[2]) {
    if (pipe(fd) < 0) { perror("pipe"); return -1; }
    /* fd[0] read end, fd[1] write end */
    return 0;
}

fork ile Birleştirme

fork() sonrasında hem üst hem de alt süreç pipe'ın tanımlayıcılarını paylaşır. Üst ve alt süreçler bu şekilde iletişim kurar: biri yazar, diğeri okur.

Kullanılmayan Uçları Kapatma

Her süreç kullanmadığı ucu kapatmalıdır. Okuyucu yazma ucunu, yazıcı ise okuma ucunu kapatır. Aksi takdirde okuyucu dosya sonunu asla göremez.

#include <unistd.h>

void parent_as_writer(int fd[2]) {
    close(fd[0]);              /* parent will not read */
    write(fd[1], "hello", 5);  /* parent writes */
    close(fd[1]);              /* signal EOF to reader */
}

Üst ve Alt Süreç Örneği

Üst süreç bir ileti yazar, alt süreç ise bu iletiyi okur. Her biri ihtiyaç duymadığı ucu kapatır.

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

void demo(int fd[2]) {
    if (fork() == 0) {           /* child: reader */
        close(fd[1]);
        char buf[64];
        ssize_t n = read(fd[0], buf, sizeof buf - 1);
        buf[n] = 0;
        printf("child got: %s\n", buf);
        close(fd[0]);
    } else {                     /* parent: writer */
        close(fd[0]);
        write(fd[1], "hi child", 8);
        close(fd[1]);
    }
}

Okuma EOF Döndürür

Tüm yazma uçları kapatıldığında read, dosya sonunu bildirmek için 0 döndürür. Bir yazma ucu açık kalırsa okuyucu daha fazla veri beklerken sonsuza dek engellenir; bu yaygın bir hatadır.

Pipe Kapasitesi ve Engelleme

Bir pipe'ın sınırlı bir arabelleği vardır (çoğunlukla 64 KB). Arabellek dolarsa write, okuyucu verileri boşaltana kadar engellenir. Arabellek boşsa read, veri gelene kadar engellenir. Bu akış denetimi iki süreci eşzamanlar.

dup2 ile Yönlendirme

dup2, bir sürecin standart girdisini veya standart çıktısını bir pipe ucuyla değiştirebilir. Kabuklar cmd1 | cmd2 yapısını bu şekilde uygular; bir komutun çıktısını sonraki komutun girdisine bağlar.

#include <unistd.h>

void stdout_to_pipe(int fd[2]) {
    close(fd[0]);
    dup2(fd[1], STDOUT_FILENO); /* writes to stdout go into pipe */
    close(fd[1]);
}

Adlandırılmış Pipe'lar (FIFOs)

Normal bir pipe yalnızca ilişkili süreçleri bağlar. mkfifo ile oluşturulan adlandırılmış pipe (FIFO), dosya sisteminde görünür; böylece ilişkisiz süreçler bunu yoluyla açıp iletişim kurabilir.

#include <sys/stat.h>

int make_fifo(const char *path) {
    return mkfifo(path, 0666); /* creates a FIFO file */
}

SIGPIPE Tehlikesi

Okuma ucu kapatılmış bir pipe'a yazmak SIGPIPE sinyalini üretir; bu sinyal varsayılan olarak süreci sonlandırır. Sinyali yok sayın veya write çağrısından dönen EPIPE hatasını kontrol edin.

Pipe'lar Ne Zaman Kullanılır

Pipe'lar, üst ve alt süreç arasında basit, tek yönlü akış sağlamak veya programları birbirine bağlamak için idealdir. İki yönlü iletişim ya da ilişkisiz süreçler arası iletişim için FIFO'ları, soketleri veya paylaşılan belleği değerlendirin.

Kısa Kontrol

Pipe'lar hakkındaki anlayışınızı sınayın.

Özet

Üst ve alt süreçler arası iletişim için pipe kullanmayı öğrendiniz.

  • pipe(), fd[0] (okuma) ve fd[1] (yazma) değerlerini sağlar
  • fork ile birleştirin; kullanılmayan uçları kapatın
  • Tüm yazma uçları kapandığında read, EOF durumunda 0 döndürür
  • FIFO'lar ilişkisiz süreçleri bağlar; SIGPIPE'a dikkat edin

Sıkça Sorulan Sorular

“Boru Hatları” dersi ücretsiz mi?

Evet — “Boru Hatları” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve C Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. C Academy kursu toplamda 4 dersten oluşur.

“Boru Hatları” dersinde ne öğreneceğim?

Üst-alt süreç iletişimi C Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

C Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te C Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 1. dersidir.

“Boru Hatları” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu C Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her C Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Boru Hatları
  2. Paylaşılan Bellek
  3. İleti Kuyrukları
  4. Sinyaller
← C Academy Sayfasına Dön