در یک حالت کلی، یک توصیفگرفایل (FD) جدید باز خواهید نمود که به fifo اشاره کند، و از طریق آن مینویسید. برای موقعیتهای ساده، شاید پرش از این مرحله امکان پذیر باشد.
اصلیترین روش، استفاده از لولههای با نام است:
mkfifo myfifo cat < myfifo & echo 'a' > myfifo
این کد کار میکند، اما cat بعد از خواندن یک سطر میمیرد. (در حقیقت، آنچه رخ میدهد آن است که وقتی لوله با نام توسط تمام نویسندهها بسته میشود، یک سیگنال وضعیت پایان فایل برای خواننده ارسال میشود. بنا بر این cat، یعنی خواننده، به دلیل آنکه یک پایان فایل در ورودیاش میبیند، خاتمه مییابد.)
اگر بخواهیم چندین مرتبه بدون داشتن شروع مجدد برای خواننده، در یک لوله بنویسیم چه؟ باید تمام دادههای خود را طوری مرتب کنیم که بدون چندین مرتبه باز و بسته کردن لوله فرستاده بشوند.
اگر فرمانها متوالی باشند، میتوانند گروهبندی بشوند:
cat < myfifo & { echo 'a'; echo 'b'; echo 'c'; } > myfifo
یک انتخاب میتواند، استفاده از tail -f به جای cat باشد:
tail -f myfifo & echo 'a' > myfifo # نمیمیرد echo 'b' > myfifo echo 'c' > myfifo
در اینجا مشکل این است که، حتی اگر لوله با نام حذف شود، پردازش tail نمیمیرد. در اسکریپت این مشکلی نیست چون میتوانید tail را موقع خروج kill کنید. همچنین یک گزینه --pid برای tail وجود دارد که در چنین حالاتی میتواند سودمند باشد.
اما اگر آن فرمانها به عللی نتوانند گروهی بشوند یا اگر استفاده از tail یک انتخاب نباشد، راه بهتر تخصیص یک توصیفگر فایل به لوله و نوشتن در آنجا میباشد:
cat < myfifo & # را اختصاص میدهد fd 3 توصیفگر exec 3>myfifo # به جای باز کردن مجدد لوله fd 3 نوشتن در echo 'a' >&3 echo 'b' >&3 echo 'c' >&3 # fd بستن exec 3>&-
بستن FD باعث میشود خواننده لوله نشانه پایان فایل را دریافت کند.
راه حل توصیفگرفایل فوق به خوبی برای نوشتن در یک fifo از یک پوسته منفرد، به خوبی کار میکند، اما در صورتیکه پردازشهای بسیاری نیاز به نوشتن در fifo داشته باشند، اینطور نیست. در این حالت، یک راه چاره باز نگاه داشتن fifo توسط یک نویسنده است:
mkfifo myfifo # باز شده را برای استفاده یک نویسنده حفظ میکند fifo cat > myfifo
یک خواننده را در پوسته دیگری باز کنید:
cat myfifo
آنوقت هر تعداد پوسته که میخواهید برای ارسال دادهها به خواننده به کار ببرید:
echo something > myfifo # خواننده نمیمیرد
برای خاتمه یافتن خواننده، به اولین cat (نویسنده) بازگردید و با استفاده از CTRL-C یک EOF برایش ارسال کنید(یا با استفاده از CTRL-C آن را خاتمه بدهید).
پرسش و پاسخ 85 (آخرین ویرایش 2013-03-07 17:00:39 توسط put92-6-88-165-39-120)