En introduktion till FIFO
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
$> 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
$> 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.
Relaterat
Senaste nyheterna och inläggen
CyberInfo Sverige är ett IT- och medieföretag i nordvästra Skåne som tillhandahåller böcker, utbildningar, nyheter och konsulttjänster inom Linux, BSD och programmering.
CyberInfo Sverige är godkänd för F-skatt, är momsregistrerat och innehar
utgivningsbevis för webbplatsen www.cyberinfo.se.