FIFO står för First In, First Out, och är en typ av rörledning som vi kan skapa på systemet som går att använda mellan helt orelaterade processer. FIFOs fungerar som så att en fil skapas på hårddisken i systemet. Processerna som ska kommunicera med varandra använder sedan den filen. En annan fördel med FIFOs är att vi kan använda dem tillsammas med redan befintliga program. Där vanliga rörledningar inte räcker till kan man ofta använda just FIFO.

En FIFO skapas med mkfifo-kommandot. Observera att FIFO-filen finns kvar ända tills dess att den manuellt raderas. Filen kommer inte försvinna ens vid omstart av systemet.

När vi använder FIFO kommer den sändande sidan att hamna i blockerat läget (blocking state), ända tills någon på “andra sidan” tar emot datan. Detsamma gäller tvärtom; en mottagare som lyssnar på en FIFO efter data, kommer att blockera tills den tagit emot datan och fått ett EOF.

Nu ska vi testa att skapa och använda FIFO:s. Öppna två terminaler på datorn. Här döper vi dem till Terminal 1 och Terminal 2.

Terminal 1

ANNONS

$> mkfifo /tmp/myfifo
$> echo "Hejsan svejsan" > /tmp/myfifo

Nu blir processen ovan blockerad ända tills vi tar emot datan på andra sidan. Låt terminalen vara igång och växla till den andra terminalen.

Terminal 2

$> cat /tmp/myfifo
Hejsan svejsan

Nu blev processen från den första terminalen “klar”, och meddelandet skrevs ut i terminal 2. Om vi tittar på filen med ls -l ser vi att den har typen p, vilket betyder just FIFO (man ls).

$> ls -l /tmp/myfifo 
prw-r--r--  1 jake  wheel  0 Aug 23 02:48 /tmp/myfifo

Eftersom FIFOs är filer kan vi ändra rättigheter på dem så att andra användare kan skriva och läsa till samma FIFO. I exemplet ovan har ägaren till FIFOn läs- och skrivrättigheter, gruppen har läsrättigheter och övriga användare har läsrättigheter. Detta innebär att alla användare på systemet kan läsa meddelanden från just denna FIFO.

Terminal 1

$> whoami
jake
$> echo "Ett nytt meddelande" > /tmp/myfifo

Terminal 2

$> whoami
kalle
$> cat /tmp/myfifo
Ett nytt meddelande

Kalle får däremot inte skriva till FIFOn eftersom han saknar skrivrättigheter till den.

$> whoami
kalle
$> echo "Kalle säger hej" > /tmp/myfifo
bash: /tmp/myfifo: Permission denied

Beroende på vad vi ska använda FIFOn till bör vi sätta rättigheterna 600, så att ingen annan än ägaren själv kan läsa och skriva till FIFOn.

Terminal 1

$> whoami
jake
chmod 600 /tmp/myfifo
$> echo "Ett hemligt meddelande" > /tmp/myfifo 

Terminal 2

ANNONS

$> whoami
kalle
cat /tmp/myfifo
cat: /tmp/myfifo: Permission denied

Nu har vi gjort vår FIFO säkrare så att endast ägaren jake kan läsa meddelanden från FIFOn. Notera att meddelandet “Ett hemligt meddelande” fortfarande ligger kvar i FIFOn från ovanstående exempel. Vi kan nu öppna upp en tredje terminal och skriva ytterligare ett meddelande till FIFOn.

Terminal 3

$> whoami
jake
echo "Ett nytt meddelande" > /tmp/myfifo

Nu öppnar vi upp ytterligare en terminal och tar emot båda meddelanden som ligger i FIFOn.

Terminal 4

$> whoami
jake
$> cat /tmp/myfifo
Ett nytt meddelande
Ett hemligt meddelande

Vi kan ta emot data med cat och lämna processen öppen ända till cat tar emot ett EOF (End Of File). Detta kan vi demonstrera med nedanstående exempel.

Terminal 1

$> cat /tmp/myfifo

Processen kommer nu att blockera och väntar på data från FIFOn. Öppna en ny terminal gör enligt nedan.

Terminal 2

$> cat > /tmp/myfile
Hej
Data kommer nu att tas emot i terminal 1 allteftersom
vi skriver nya meddelanden

Nu kan vi fortsätta att skriva meddelanden, och de kommer hela tiden att dyka upp i terminal 1 efterhand som vi skickar dem. Processerna kommer inte att avslutas förrän vi skickar ett EOF genom att trycka CTRL-D.


Kommentarer

Kommentarsfältet är modererat. Det innebär att alla kommentarer granskas av ansvarig utgivare före publicering.

Du väljer själv om du vill ange ditt riktiga namn, en pseudonym eller vara helt anonym. Ingen registrering behövs.