int hoofd() {
intfd[2]; // Bestandsbeschrijvingen voor de pijp
pid_t pid;
als (pijp(fd) ==-1) {
perr("pijp mislukt");
uitgang(1);
}
pid =vork();
als (pid <0) {
perror("vork mislukt");
uitgang(1);
} else if (pid ==0) {// Onderliggend proces
sluiten(fd[1]); // Sluit het schrijfeinde
char-buffer[100];
read(fd[0], buffer, groottevan(buffer));
printf("Kind ontvangen:%s\n", buffer);
sluiten(fd[0]);
} else {// Bovenliggend proces
sluiten(fd[0]); // Sluit het leeseinde
const char* message ="Hallo van ouder!";
write(fd[1], bericht, strlen(bericht) + 1); // +1 voor null-terminator
sluiten(fd[1]);
wacht(NULL); // Wacht tot het kind klaar is
}
retour 0;
}
```
Named Pipes (FIFO's):
* Creatie: Gemaakt met behulp van de systeemaanroep `mkfifo()`. Hierdoor wordt een bestand in het bestandssysteem gemaakt dat de pipe vertegenwoordigt. De bestandsnaam fungeert als identificatie voor de pipe.
* Toegang: Meerdere processen hebben toegang tot een benoemde pipe. Elk proces dat het pad van de pipe kent, kan het openen voor lezen of schrijven (hoewel er slechts één proces tegelijk kan schrijven, tenzij speciale configuraties worden gebruikt). Ze overleven langer dan de levensduur van de processen die ze gebruiken.
* Levensduur: De pipe blijft in het bestandssysteem aanwezig totdat deze expliciet wordt verwijderd met `unlink()`.
* Voorbeeld (met behulp van twee afzonderlijke programma's die communiceren via een benoemde pipe):
Je hebt twee programma's nodig:een om naar de FIFO te schrijven, en een ander om ervan te lezen. `mkfifo()` wordt één keer aangeroepen (misschien in een setup-script) om de FIFO te maken, waarna de programma's `open()` de FIFO openen voor lezen/schrijven. De processen moeten fouten afhandelen, inclusief de mogelijkheid dat de FIFO niet bestaat en fouten op `open()`.
Belangrijkste verschillen samengevat:
| Kenmerk | Naamloze pijp | Genoemde pijp (FIFO) |
|---------------|--------------------------|--------------------------|
| Creatie | `pijp()` | `mkfifo()` |
| Toegang | Alleen creatieproces | Meerdere processen |
| Volharding | Bestaat alleen tijdens de levensduur van het proces | Blijft bestaan in bestandssysteem |
| Interproces | Meestal ouder-kind of expliciet verbonden processen | Kan niet-gerelateerde processen verbinden |
| Bestandssysteeminvoer | Nee | Ja |
Benoemde leidingen zijn flexibeler voor de communicatie tussen niet-gerelateerde processen, terwijl naamloze leidingen eenvoudiger en efficiënter zijn voor de communicatie tussen nauw verwante processen, zoals een ouder en zijn kind. De keuze hangt af van de specifieke communicatiebehoeften van uw toepassing.