int main () {
int fd [2]; // filbeskrivare för röret
pid_t pid;
if (pipe (fd) ==-1) {
perror ("rör misslyckades");
utgång (1);
}
pid =gaffel ();
if (pid <0) {
perror ("gaffel misslyckades");
utgång (1);
} annars om (pid ==0) {// barnprocess
Close (FD [1]); // Stäng skrivänden
Char Buffer [100];
läs (FD [0], buffert, storlek (buffert));
printf ("barn mottagen:%s \ n", buffert);
Close (FD [0]);
} annat {// förälderprocess
Close (FD [0]); // Stäng läsänden
const char* meddelande ="Hej förälder!";
skriv (FD [1], meddelande, strlen (meddelande) + 1); // +1 för nollterminator
Close (FD [1]);
vänta (null); // Vänta på att barnet är slut
}
return 0;
}
`` `
namngivna rör (FIFOS):
* skapande: Skapad med systemsamtalet `mkfifo (). Detta skapar en fil i filsystemet som representerar röret. Filens namn fungerar som identifierare för röret.
* Access: Flera processer kan komma åt ett namngivet rör. Varje process som känner till rörets väg kan öppna den för läsning eller skriva (även om bara en process kan skriva åt gången, såvida inte använder specialkonfigurationer). De överlever utöver livslängden för processerna med dem.
* livstid: Röret kvarstår i filsystemet tills det uttryckligen har raderats med `unlink ()`.
* Exempel (med två separata program som kommunicerar genom ett namngivet rör):
Du skulle behöva två program:ett för att skriva till FIFO och ett annat att läsa från den. `mkfifo ()` kallas en gång (kanske i ett installationsskript) för att skapa FIFO, sedan programmen `open ()` femo för läsning/skrivning. Processerna måste hantera fel inklusive möjligheten att FIFO inte finns och fel på `open ()`.
Nyckelskillnader sammanfattade:
| Funktion | Namnlösa rör | Namnet Pipe (FIFO) |
| ----------------- | ---------------------------- | --------------------------------- |
| Skapelse | `pipe ()` | `mkfifo ()` |
| Åtkomst | Bara skapa process | Flera processer |
| Uthållighet | Existerar endast under processlivstiden | Fortsätter i filsystemet |
| Interprocess | Vanligtvis förälder-barn eller uttryckligen anslutna processer | Kan ansluta icke -relaterade processer |
| Filsysteminmatning | Nej | Ja |
Namngivna rör är mer flexibla för kommunikation mellan icke -relaterade processer, medan namngivna rör är enklare och mer effektiva för kommunikation mellan nära besläktade processer som en förälder och dess barn. Valet beror på den specifika kommunikationsbehovet i din applikation.