Bosh sahifa Wiki FIFO

FIFO

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.

Protocol:

  • 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:

  • ikki yo‘nalish;
  • client connection;
  • credential;
  • datagram;
  • file descriptor passing.

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 read yoki write;
  • 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