NamedPipes - آموزش اسکریپت نویسی
X
تبلیغات
رایتل

آموزش اسکریپت نویسی

آموزش اسکریپت نویسی پوسته گنو-لینوکس

#!/bin/bash

NamedPipes

Named Pipes

کار با لوله‌های با نام

لوله‌ها امکان ارتباط پردازشها با یکدیگر را فراهم می‌کنند. همچنین لوله ممکن است به عنوان 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: انتظار برای داده
    [...]


CategoryUnix

  • لوله‌های با نام ( آخرین ویرایش‎2012-07-21 09:01:02‎ توسط 77)