آموزش‌های خط فرمانی

این وبلاگ تلاش می‌کند گامی در حد بضاعت در جهت آموزش خط فرمان و اسکریپت‌نویسی پوسته گنو-لینوکس بردارد.

آموزش‌های خط فرمانی

این وبلاگ تلاش می‌کند گامی در حد بضاعت در جهت آموزش خط فرمان و اسکریپت‌نویسی پوسته گنو-لینوکس بردارد.

نوشتن مکرر در یک فایل 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)


نظرات 0 + ارسال نظر
ایمیل شما بعد از ثبت نمایش داده نخواهد شد