mkfifo


1. คำสั่ง mkfifo คืออะไร และหน้าที่หลัก

ในโลกของระบบปฏิบัติการ Linux การสื่อสารระหว่างกระบวนการ (Inter-Process Communication – IPC) เป็นหัวใจสำคัญของการทำงานอัตโนมัติและสคริปต์ที่ซับซ้อน คำสั่ง mkfifo ย่อมาจาก “make FIFO” ซึ่งใช้สำหรับสร้างไฟล์พิเศษประเภทหนึ่งที่เรียกว่า **Named Pipe** หรือ **FIFO (First-In, First-Out)**

หลักการทำงาน: โดยปกติแล้ว การส่งข้อมูลระหว่างโปรแกรมจะทำผ่าน Standard Input/Output (|) ซึ่งเป็น pipe ชั่วคราวที่ระบบจัดการให้ แต่เมื่อเราต้องการให้กระบวนการ A และกระบวนการ B ที่รันแยกกันและไม่เกี่ยวข้องกันโดยตรงสามารถแลกเปลี่ยนข้อมูลได้เหมือนกับการสื่อสารผ่านท่อจริง ๆ เราต้องใช้ Named Pipe

  • Named Pipe (FIFO): คือไฟล์เสมือนที่ทำหน้าที่เป็นช่องทางในการไหลของข้อมูล เมื่อโปรแกรมหนึ่งเขียนข้อมูลลงใน FIFO อีกโปรแกรมหนึ่งที่กำลังรออ่านอยู่จะสามารถรับข้อมูลนั้นไปได้ทันที
  • ความแตกต่างจาก Pipe ทั่วไป: Pipe ทั่วไป (|) จะมีขอบเขตจำกัดอยู่ใน Shell Session เดียว แต่ FIFO ที่สร้างด้วย mkfifo จะคงอยู่บนระบบไฟล์และสามารถถูกเข้าถึงโดยกระบวนการใด ๆ ก็ได้ที่ทราบชื่อของมัน

2. ไวยากรณ์ (Syntax) และพารามิเตอร์สำคัญ

mkfifo [OPTION]... [FILE]...
  • -m mode: กำหนดสิทธิ์ (Permissions) ของไฟล์ FIFO ที่สร้างขึ้น เช่น mkfifo mypipe --mode=0666
  • FILE…: ชื่อของ Named Pipe ที่ต้องการสร้าง (เช่น data_stream)

ข้อควรจำ: หากไฟล์ชื่อ FIFO นั้นมีอยู่แล้ว การรันคำสั่ง mkfifo จะล้มเหลวด้วยข้อผิดพลาด (Error) ดังนั้นในการเขียนสคริปต์ ควรมีการตรวจสอบการมีอยู่ของไฟล์ก่อนเสมอ


3. ตัวอย่างการใช้งานจริง (Code Examples & Use Cases)

สถานการณ์ที่เหมาะสมที่สุดในการใช้ FIFO คือเมื่อเราต้องการให้โปรแกรมหลายตัวทำงานแบบ Asynchronous และสื่อสารกันโดยไม่จำเป็นต้องรันใน Shell เดียวกัน

  • Use Case: Message Queue Simulation
    ใช้ FIFO เป็นคิวกลางสำหรับระบบที่รับข้อมูลจากแหล่งภายนอก (เช่น Sensor Data) และให้ Worker Process หลายตัวมาอ่านและประมวลผล
  • Use Case: Decoupling Processes
    เมื่อคุณมี Producer Process (ผู้ผลิตข้อมูล) และ Consumer Process (ผู้บริโภคข้อมูล) การใช้ FIFO จะช่วยให้ทั้งสองส่วนทำงานได้อย่างอิสระและไม่บล็อกการทำงานของกันและกัน

ตัวอย่างโค้ด (Simulation):

# 1. สร้าง FIFO ใน Background Shell Session หรือ Terminal ใหม่
mkfifo data_pipe &

# 2. เปิด Terminal ที่สอง (Consumer) เพื่อรอรับข้อมูล
echo "Waiting for data..."
cat data_pipe  # คำสั่ง cat จะบล็อกการทำงานจนกว่าจะมีข้อมูลมาถึง

# 3. กลับมาที่ Terminal แรก (Producer) เพื่อส่งข้อมูล
(
    sleep 1
    echo "System Status: OK" > data_pipe # เขียนข้อมูลลงใน FIFO
    sleep 2
    echo "User Login Detected" > data_pipe
) &

4. ข้อควรระวังและ Best Practices

  • การทำความสะอาด (Cleanup): FIFO เป็นไฟล์จริงบนระบบไฟล์ ดังนั้นเมื่อใช้งานเสร็จแล้ว ต้องใช้ rm data_pipe เพื่อลบออก มิฉะนั้นจะทำให้เกิดขยะในระบบไฟล์
  • การจัดการสิทธิ์ (Permissions): ควรระมัดระวังเรื่องสิทธิ์ในการอ่าน/เขียน เนื่องจาก FIFO เป็นจุดรวมข้อมูลที่ทุกกระบวนการสามารถเข้าถึงได้
  • การจัดการ Blocking: คำสั่งที่อ่านจาก FIFO (เช่น cat) จะทำงานแบบบล็อก (Blocking) นั่นหมายความว่ามันจะหยุดรอจนกว่าจะมีข้อมูลมาถึง การออกแบบสคริปต์ต้องคำนึงถึงพฤติกรรมนี้

สรุปการประยุกต์ใช้สำหรับ SysAdmin/DevOps: mkfifo เป็นเครื่องมือที่ทรงพลังสำหรับการสร้างระบบ Message Queue อย่างง่าย (Lightweight MQ) หรือการจำลองท่อข้อมูลขนาดใหญ่ในสคริปต์ Bash ที่ซับซ้อน โดยเฉพาะอย่างยิ่งในการทำ CI/CD Pipeline ที่ต้องการให้หลายขั้นตอนทำงานแบบขนานและสื่อสารกันผ่านจุดกลาง