دو فرآیند نا مرتبط نمیتوانند از شناسهها، محیط یا stdin/stdout برای مراوده استفاده کنند، برخی اشکال ارتباط درون فرآیندی(IPC) لازم است.
پردازش A در یک فایل مینویسد، و پردازش B فایل را میخواند. این شیوه همگام شده نمیباشد، بنابراین اگر در حالیکه A در فایل مینویسد، B بتواند آنرا بخواند، یک روش مطمئن نیست. شاید قفل دایرکتوری، یا سیگنال بتواند کمک کند.
mkdir میتواند برای بررسی وجود یک شاخه و ایجاد آن در یک عملیات تجزیه ناپذیر به کار برود، بدین ترتیب میتواند به عنوان یک قفل به کار برود، گرچه روش خیلی مؤثری نیست.
اسکریپت A:
until mkdir /tmp/dir;do # تا بتوانیم شاخه را ایجاد نماییم منتظر میماند sleep 1 done echo foo > file # نوشتن در فایل، این بخش حساس است rmdir /tmp/dir # پاک کردن قفل
اسکریپت B:
until mkdir /tmp/dir;do #انتظار تا بتوانیم دایرکتوری را ایجاد کنیم sleep 1 done read var < file # خواندن فایل، این بخش حساس است echo "$var" # نمیتواند در فایل بنویسد A اسکریپت rmdir /tmp/dir # حذف قفل
برای مثالهای بیشتر قفل دایرکتوری، پرسش و پاسخ شماره 45 و mutex را ببینید.
سیگنالها احتمالاً سادهترین شکل IPC(مترجم: مخفف InterProcess Communication یا ارتباط درون فرآیندی) میباشند:
اسکریپت A:
trap 'flag=go' USR1 # USR1 تنظیم اداره کننده سیگنال برای سیگنال # echo $$ > /tmp/ScriptA.pid # را در یک فایل ذخیره کنیم pid اگر بخواهیم flag="" while [[ $flag != go ]]; do # B انتظار برای چراغ سبز از اسکریپت sleep 1; done echo we received the signal
شما باید pid اسکریپت دیگر را برای ارسال یک سیگنال جهت کشتن آن، بدانید یا پیداکنید :
#kill all the pkill -USR1 -f ScriptA # خود را در فایل ذخیره کرده باشد pid شماره A اگر اسکریپت kill -USR1 $(</var/run/ScriptA.pid) # :فرزند باشد A اگر اسکریپت ScriptA & pid=$! kill -USR1 $pid
دو روش اول ضد گلوله نیستند و اگر شما بیش از یک نمونه از اسکریپت A را اجرا نمایید موجب دردسر خواهند شد.
لولههای با نام شکل بیشتر توانمند IPC هستند. آنها در صفحه خودشان تشریح شدهاند: NamedPipes.
پرسش و پاسخ 27 (آخرین ویرایش 2010-05-11 05:25:30 توسط p5B09615D)