منبع اصلی نوشتار زیر در این لینک قرار دارد

نوشتن مکرر در یک فایل fifo باز


چگونه می‌توان چند مرتبه در فایل fifo بدون باز کردن مجدد آن، نوشت؟

در یک حالت کلی، یک توصیف‌گرفایل (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‎ آن را خاتمه بدهید).


CategoryShell

پرسش و پاسخ 85 (آخرین ویرایش ‎2013-03-07 17:00:39‎ توسط put92-6-88-165-39-120)




به سیاره لینوکس امتیاز دهید

به اين صفحه امتياز دهيد