FIFO — filesystemda nomga ega bo‘lgan va processlar orasida byte oqimini uzatadigan maxsus fayl turi. Uning nomi First In, First Out tamoyilidan kelib chiqqan.
FIFO ko‘pincha named pipe deb ataladi. Bir process path orqali yozadi, boshqasi shu path orqali o‘qiydi.
FIFO ichidagi ma’lumot oddiy disk fayli sifatida saqlanmaydi. Kernel buffer orqali writerdan readerga uzatiladi.
Yaratish
Unix tizimda FIFO mkfifo buyrug‘i bilan yaratiladi.
mkfifo /tmp/events.pipe
Filesystem entry maxsus file type sifatida ko‘rinadi.
Dastur mkfifo() syscall yoki library funksiyasidan foydalanishi mumkin.
Reader va writer
Reader:
cat /tmp/events.pipe
Writer:
printf 'hello\n' > /tmp/events.pipe
Reader va writer bir vaqtda ulanganida data oqadi.
Open xatti-harakati
Blocking rejimda FIFOni faqat o‘qish uchun ochgan process writer kelguncha kutishi mumkin.
Faqat yozish uchun ochgan process esa reader kelguncha kutadi.
Bu producer va consumerning uchrashuv nuqtasi vazifasini bajaradi.
Non-blocking open
Non-blocking rejimda:
- reader writer bo‘lmasa ham ochilishi mumkin;
- writer reader bo‘lmasa xato olishi mumkin.
Aniq xatti-harakat OS va flaglarga bog‘liq.
Byte stream
FIFO message boundaryni saqlamaydi.
Ikki yozuv readerga bitta blok yoki bir nechta bo‘lak ko‘rinishida kelishi mumkin.
- newline;
- fixed-size record;
- length prefix;
- binary framing
ishlatadi.
Atomic write
PIPE_BUFgacha bo‘lgan yozuv bir nechta writer orasida atomik bo‘lishi kafolatlanadi.
Masalan, har writer bitta qisqa log qator yuborsa, qatorlar bayt darajasida aralashmasligi mumkin.
Katta yozuvlar aralashishi mumkin.
FIFO tamoyili
Kernel bufferga oldin yozilgan baytlar oldin o‘qiladi.
Biroq bir nechta writer va scheduler mavjud bo‘lsa, qaysi writer qachon yozishi alohida masala.
FIFO barcha producerlar uchun qat’iy global biznes tartibini kafolatlamaydi.
EOF
Barcha writerlar FIFOni yopsa, reader EOF oladi.
Yangi writer keyin ulanishi mumkin, ammo reader EOFdan keyin pathni qayta ochishi kerak bo‘lishi mumkin.
Daemon FIFOni uzoq ishlatsa, lifecycle’ni aniq boshqaradi.
Broken pipe
Readerlar yo‘q bo‘lsa, writer SIGPIPE yoki EPIPE olishi mumkin.
Signal default holatda processni tugatishi mumkin.
Dastur xatoni qayta ishlaydi va kerak bo‘lsa qayta ulanishga urinadi.
Permission
FIFO filesystem permissionlariga ega.
Misol:
prw-r----- service service
Faqat owner va group ruxsatiga ega processlar ochadi.
FIFO world-writable bo‘lsa, begona user soxta data yuborishi mumkin.
Joylashuv
Runtime FIFO odatda:
/run/application/
kabi katalogda yaratiladi.
/tmp umumiy va race hujumlariga ochiq bo‘lishi mumkin. Private katalog va to‘g‘ri permission ishlatiladi.
Stale FIFO
Process tugagach FIFO path filesystemda qoladi.
Keyingi ishga tushishda:
- file turi tekshiriladi;
- owner tekshiriladi;
- eski FIFO olib tashlanadi;
- yangisi xavfsiz yaratiladi.
Path o‘rniga attacker oddiy file yoki symlink yaratgan bo‘lishi mumkin.
Log va command channel
FIFO orqali daemon’ga:
uzatilishi mumkin.
Katta va ishonchli message tizimi uchun queue yoki socket qulayroq.
Bir nechta reader
Bir FIFOni bir nechta reader ochsa, data odatda ular orasida taqsimlanadi. Har reader barcha xabarni olmaydi.
Broadcast kerak bo‘lsa FIFO mos emas.
Har consumer uchun alohida FIFO yoki broker ishlatiladi.
Bir nechta writer
Ko‘p writer bitta FIFOga yozishi mumkin.
Record PIPE_BUFdan kichik saqlansa aralashish kamayadi.
Writer identifikatori payload ichida beriladi.
FIFO va oddiy fayl
| Jihat | FIFO | Oddiy fayl |
|---|---|---|
| Data saqlanishi | Vaqtinchalik kernel buffer | Diskda |
| Seek | Yo‘q | Bor |
| Reader/writer uchrashuvi | Kerak bo‘lishi mumkin | Kerak emas |
| EOF | Writerlar yopilganda | Fayl oxirida |
| Qayta o‘qish | Data ketadi | Mumkin |
FIFO lsda file ko‘rinsa ham oddiy fayl emas.
FIFO va Unix socket
Unix socket ko‘proq imkoniyat beradi:
FIFO sodda bir yo‘nalishli oqim uchun qulay.
FIFO va message queue
Message queue xabar chegarasi, priority va ba’zan persistence beradi.
FIFO byte stream va cheklangan kernel bufferga ega.
Consumer o‘chganida FIFO data odatda uzoq saqlanmaydi.
Backpressure
Reader sekin bo‘lsa FIFO buffer to‘ladi va blocking writer kutadi.
Bu tabiiy backpressure.
Non-blocking writer EAGAIN olib, data tashlashi yoki keyin qayta urinishi mumkin.
Security
FIFO orqali kelgan data ishonchsiz input sifatida tekshiriladi.
Himoya:
- private directory;
- owner va mode;
- symlinkdan himoya;
- input length;
- command allowlist;
- process privilege;
- cleanup.
Diagnostika
FIFO ishlamasa:
- path mavjudligi;
- file type;
- permission;
- reader;
- writer;
- blocked
open; - blocked
readyokiwrite; - EOF;
- SIGPIPE;
- buffer;
- stale path
tekshiriladi.
lsof yoki process descriptor ma’lumoti FIFOni kim ochganini ko‘rsatadi.
Service integratsiyasi
FIFO legacy dasturdan event olish yoki oddiy command channel yaratishda ishlatilishi mumkin.
Systemd service ishga tushishidan oldin runtime katalog va FIFOni yaratishi mumkin. Service useri pathga ruxsat oladi, boshqa userlar cheklanadi.
FIFO reader qayta ishga tushganda writer xatoni boshqarishi va qayta ochishi kerak. Doimiy ishonchli xabar uchun broker afzal.
Monitoring
FIFOning o‘zida queue depthni qulay ko‘rish imkoniyati cheklangan. Blocklangan writerlar, process state va I/O wait orqali yuk aniqlanadi.
Bog‘liq tushunchalar
Named pipe, Pipe, IPC, File descriptor, PIPE_BUF, SIGPIPE, Byte stream, Unix domain socket, Message queue