لولهها امکان ارتباط پردازشها با یکدیگر را فراهم میکنند. همچنین لوله ممکن است به عنوان FIFO (اختصاری برای First In- First Out) شناخته شود.
برتری آنها از کاربرد فایلها به عنوان وسیله ارتباط، آن است که با استفاده از لولهها، پردازشها با یکدیگر همگام میشوند: اگر پردازشی از یک لوله نخواند، پردازش نوشتن در لوله مسدود میشود، و اگر نویسنده وجود نداشته باشد، پردازش خواندن از لوله، مسدود میشود.
مثال زیر نمونهای از لوله نامگذاری شده است، در اینجا به عنوان pipe1 نامیده شده.
cd /tmp mkfifo pipe1
برای ارسال یک پیغام به لوله، از این استفاده کنید:
echo "hello" > pipe1
در این نقطه به نظر میرسد پردازش هنگ شده باشد. پردازش دیگری برای جمعآوری داده در حال اجرا نیست، بنابراین کرنل پردازش را به حالت تعلیق در میآورد. گفته میشود پردازش در این مرحله مسدود(blocked) گردیده است.
امکان دارد در ترمینال دیگری، اطلاعات از لوله جمع آوری گردد، به این شکل:
cat /tmp/pipe1
اکنون توسط cat اطلاعات از لوله خوانده خواهد شد( و در ترمینال نوشته میشود)، و پردازش نویسندهِ مسدودشده برای ادامه یافتن آزاد میشود.
برای برخی اطلاعات بیشتر، پرسش و پاسخ شماره ۸۵ را ببینید.
این مثال کوچکی از مخابره کردن یک پردازش سرویسدهنده با یک پردازش سرویسگیرنده است. سرویسدهنده فرمانها را به سرویسگیرنده ارسال میکند، و سرویس گیرنده هر فرمان را تصدیق میکند:
نوشتن هر دو مثال سرویس دهنده و سرویس گیرنده به ترتیب در فایلها، و شروع همزمان آنها برای دیدن کارکرد آن:
# server مثال ارتباط
# ندارند، اما"mkfifo" برخی سیستمها فرمان ،FIFO ایجاد یک
# استفاده میکنند "mknod pipe p" به جای آن از
mkfifo pipe
while sleep 1
do
echo "server: sending GO to client"
# فرمان زیر باعث میشود پردازش مسدود(منتظر) بشود
# تا آنکه پردازش دیگر از لوله بخواند
echo GO > pipe
# سرویس گیرنده رشته را میخواند! حالا منتظر جواب میماند. فرمان
# دوباره مسدود میشود تا سرویس گیرنده چیزی بنویسد "read"
read answer < pipe
# !سرویس گیرنده پاسخ داد
echo "server: got answer: $answer"
done
# سرویس گیرنده
# تا وقتی سرور لوله را ایجاد کند ما نمیتوانیم شروع کنیم
until [ -p pipe ]
do
sleep 1; # انتظار برای ایجاد لوله سرور
done
# حالا برقراری ارتباط
while sleep 1
do
echo "client: waiting for data"
# :انتظار تا سرور یک سطر از داده را ارسال کند
read data < pipe
# !یک سطر رسید
echo "client: read <$data>, answering"
# .حالا تصدیق میکند که داده را دریافت کرده
# .این فرمان تا سرور آن را بخواند متوقف میشود
echo ACK > pipe
done
$ chmod +x server client
$ server & client &
server: به سرویس گیرنده GO ارسال
client: انتظار برای داده
client: و پاسخ <GO>خواندن
server: پاسخ دریافت شد ACK
server: به سرویس گیرنده GO ارسال
client: انتظار برای داده
client: و پاسخ <GO>خواندن
server: پاسخ دریافت شد ACK
server: به سرویس گیرنده GO ارسال
client: انتظار برای داده
[...]