0Pricing
C Academy · Pelajaran

Pipe

Komunikasi induk-anak.

Pipe adalah pelajaran C Academy gratis di CoddyKit. Ini adalah pelajaran 1 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar C Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus C Academy mencakup 4 pelajaran total.

Apa Itu Pipa

Pipa adalah saluran komunikasi satu arah antara proses yang saling terkait. Satu proses menulis byte ke dalamnya dan proses lain membacanya, seperti ban berjalan yang mengangkut data.

Dua Deskriptor Berkas

Pemanggilan pipe() mengisi array yang terdiri dari dua elemen: fd[0] adalah ujung baca dan fd[1] adalah ujung tulis. Data yang ditulis ke fd[1] dapat dibaca dari fd[0].

#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;
}

Menggabungkan dengan fork

Setelah fork(), proses induk dan anak sama-sama memiliki deskriptor pipa. Inilah cara proses induk dan anak berkomunikasi: satu menulis, yang lain membaca.

Tutup Ujung yang Tidak Digunakan

Setiap proses harus menutup ujung yang tidak digunakannya. Pembaca menutup ujung tulis; penulis menutup ujung baca. Jika tidak, pembaca tidak pernah melihat akhir berkas.

#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 */
}

Contoh Proses Induk dan Anak

Proses induk menulis pesan; proses anak membacanya. Masing-masing menutup ujung yang tidak diperlukan.

#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]);
    }
}

Pembacaan Mengembalikan EOF

Ketika semua ujung tulis ditutup, read mengembalikan 0 sebagai tanda akhir berkas. Jika sebuah ujung tulis tetap terbuka, pembaca akan terus memblokir sambil menunggu data lainnya. Ini adalah kesalahan yang umum.

Kapasitas dan Pemblokiran Pipa

Pipa memiliki buffer terbatas (sering kali 64 KB). Jika buffer penuh, write akan memblokir hingga pembaca mengosongkannya. Jika buffer kosong, read akan memblokir hingga data tiba. Pengendalian aliran ini menyinkronkan kedua proses.

Mengalihkan dengan dup2

dup2 dapat mengganti stdin atau stdout suatu proses dengan ujung pipa. Shell menggunakan cara ini untuk menerapkan cmd1 | cmd2, dengan menghubungkan keluaran satu perintah ke masukan perintah berikutnya.

#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]);
}

Pipa Bernama (FIFOs)

Pipa biasa hanya menghubungkan proses yang saling terkait. Pipa bernama (FIFO), yang dibuat dengan mkfifo, muncul di sistem berkas sehingga proses yang tidak saling terkait dapat membukanya berdasarkan jalur dan berkomunikasi.

#include <sys/stat.h>

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

Bahaya SIGPIPE

Menulis ke pipa yang ujung bacanya sudah ditutup akan memicu SIGPIPE, yang secara bawaan menghentikan proses. Abaikan sinyal tersebut atau periksa kesalahan EPIPE dari write.

Kapan Menggunakan Pipa

Pipa ideal untuk aliran data satu arah yang sederhana antara proses induk dan anak, atau untuk merangkai program. Untuk komunikasi dua arah atau komunikasi antaraproses yang tidak saling terkait, pertimbangkan FIFO, socket, atau memori bersama.

Pemeriksaan Singkat

Uji pemahaman Anda tentang pipa.

Ringkasan

Anda telah mempelajari penggunaan pipa untuk komunikasi antara proses induk dan anak.

  • pipe() memberikan fd[0] (baca) dan fd[1] (tulis)
  • Gabungkan dengan fork; tutup ujung yang tidak digunakan
  • read mengembalikan 0 pada EOF ketika semua ujung tulis ditutup
  • FIFO menghubungkan proses yang tidak saling terkait; waspadai SIGPIPE

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Pipe” gratis?

Ya — teks lengkap “Pipe” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus C Academy, upgrade ke CoddyKit PRO. Kursus C Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Pipe”?

Komunikasi induk-anak. Kamu berlatih C Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai C Academy?

Tidak diperlukan pengalaman sebelumnya. C Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 1 dari 4.

Berapa lama pelajaran “Pipe” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran C Academy ini?

Ya. Setiap pelajaran C Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Pipe
  2. Memori Bersama
  3. Antrean Pesan
  4. Sinyal
← Kembali ke C Academy