Pipes
Kommunikasjon mellom forelder og barn
Pipes er en gratis leksjon i C Academy på CoddyKit. Dette er leksjon 1 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i C Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i C Academy inneholder totalt 4 leksjoner.
Hva er et rør
Et rør er en énveis kommunikasjonskanal mellom relaterte prosesser. Én prosess skriver byte inn i røret, og en annen leser dem ut, omtrent som et transportbånd for data.
To fildeskriptorer
Kallet pipe() fyller en tabell med to elementer: fd[0] er leseenden, og fd[1] er skriveenden. Data som skrives til fd[1], kan leses fra 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;
}Kombinere med fork
Etter fork() deler foreldre- og barneprosessen rørets deskriptorer. Slik kan en forelder og et barn kommunisere: den ene skriver, og den andre leser.
Lukk ubrukte ender
Hver prosess bør lukke enden den ikke bruker. En leser lukker skriveenden, og en skriver lukker leseenden. Ellers oppdager leseren aldri slutten på filen.
#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 */
}Et eksempel med forelder og barn
Forelderen skriver en melding, og barnet leser den. Begge lukker enden de ikke trenger.
#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]);
}
}Lesing returnerer EOF
Når alle skriveender er lukket, returnerer read 0, som signaliserer slutten på filen. Hvis en skriveende fortsatt er åpen, blokkerer leseren i påvente av flere data for alltid. Dette er en vanlig feil.
Rørkapasitet og blokkering
Et rør har en buffer med begrenset størrelse (ofte 64 KB). Hvis den blir full, blokkerer write til en leser tømmer den. Hvis den er tom, blokkerer read til data ankommer. Denne flytkontrollen synkroniserer de to prosessene.
Omdirigering med dup2
dup2 kan erstatte en prosess' stdin eller stdout med en rørende. Slik implementerer skall cmd1 | cmd2, ved å koble utdataene fra én kommando til inndataene til den neste.
#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]);
}Navngitte rør (FIFO-er)
Et vanlig rør kobler bare sammen relaterte prosesser. Et navngitt rør (FIFO), opprettet med mkfifo, vises i filsystemet slik at urelaterte prosesser kan åpne det via en sti og kommunisere.
#include <sys/stat.h>
int make_fifo(const char *path) {
return mkfifo(path, 0666); /* creates a FIFO file */
}SIGPIPE-faren
Hvis De skriver til et rør der leseenden er lukket, utløses SIGPIPE, som som standard avslutter prosessen. Enten kan De ignorere signalet, eller kontrollere om write returnerer feilen EPIPE.
Når bør rør brukes
Rør egner seg godt til enkel, enveis strømming mellom en forelder og et barn, eller til å lenke sammen programmer. For toveis kommunikasjon eller kommunikasjon mellom urelaterte prosesser bør De vurdere FIFO-er, sokler eller delt minne.
Rask kontroll
Test forståelsen av rør.
Oppsummering
De har lært om rør for kommunikasjon mellom foreldre- og barneprosesser.
pipe()gir fd[0] (lesing) og fd[1] (skriving)- Kombiner med
fork, og lukk ubrukte ender - read returnerer 0 ved EOF når alle skriveender er lukket
- FIFO-er kobler sammen urelaterte prosesser; vær oppmerksom på SIGPIPE
Lær deg C med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 39
- Leksjoner
- 144
Ofte stilte spørsmål
Er leksjonen «Pipes» gratis?
Ja – hele teksten i «Pipes» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av C Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i C Academy inneholder totalt 4 leksjoner.
Hva lærer jeg i «Pipes»?
Kommunikasjon mellom forelder og barn Du øver på C Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med C Academy?
Ingen tidligere erfaring er nødvendig. C Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 1 av 4.
Hvor lang tid tar leksjonen «Pipes»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne C Academy-leksjonen?
Ja. Alle C Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.