در توسینسو تدریس کنید

و

با دانش خود درآمد کسب کنید

IPC (ارتباط میان پردازه ای) در لینوکس - قسمت پنجم

2.2. صف های پیام


msgget

با استفاده از تابع msgget ، یک صف پیام را ایجاد و به آن دسترسی پیدا می کنید.

int msgget(key_t key, int msgflg);

برنامه باید یک مقدار را برای key تعیین کند. در واقع این مقدار برای یک صف پیام مشخص، یک نام تعیین می کند. پارامتر دوم یعنی msgflg، از نه پرچم جواز تشکیل شده است. برای ایجاد یک صف پیام جدید، باید یک بیت خاص که به وسیله IPC__CREAT مشخص شده است با مجوزها یای بیتی شوند. (برای نمونه به این صورت عمل می کنیم: 0666 |IPC__CREAT). شایان ذکر است که اگر کلید یک صف موجود را به این تابع فرستاده و IPC__CREAT را هم ست کنیم، خطایی رخ نمی دهد. مقدار IPC__CREAT در صورت وجود صف به طور اتوماتیک نادیده گرفته می شود.

در صورت اجرای موفقیت آمیز این تابع، یک مقدار مثبت که شماره شناسه صف است، برگردانده می شود. در صورت شکست 1- برگرانده می شود.

msgsnd

این تابع به شما اجازه اضافه کردن یک پیام به صف پیام ها را می دهد.

int msgsnd(int msqid, const void *msg_ptr, size_t msg_sz, int msgflg);

شما باید بر روی ساختار پیام خود دو محدودیت را اعمال کنید. اول اینکه باید کوچک تر از حد سیستم باشد و دوم اینکه باید با long int شروع شود. به هنگام استفاده از پیام ها، بهتر است ساختار پبام های خود را به صورت زیر تعریف کنید:

struct my_message {
long int message_type;
// The data you wish to transfer
}

چون گیرنده پیام از message__type استفاده می کند، شما نمی توانید از آن در ساختمان صرف نظر کنید و ساختمان داده تعریف شده به وسیله شما حتما باید آن را شامل شود. همچنین بهتر است آن را مقدار دهی اولیه کنید. به وسیله این عضو از ساختمان در حقیقت می توانیم پیام های خود را اولویت دهی کنیم.

پارامترهای تابع:

  • msqid : شناسه صف پیام است که به وسیله تابع msgget برگردانده می شود.
  • msg__ptr : یک اشاره گر به پیامی است که باید برگردانده شود. طبق توضیحات قبل، پبام باید با نوع long int شروع شود.
  • msg__sz : سایز پیام مشخص شده به وسیله اشاره گر msg__prt را تعیین می کند. توجه کنید که در محاسبه سایز پیام، نباید سایز long int message__type را دخالت دهید.
  • msgflg : وقتی که صف پیام پر باشد یا محدودیت سیستم بر روی پیام های درون صف به حد نهایی خود رسیده باشد، این پارامتر مشخص می کند چه اتفاقی رخ بدهد. اگر این پارامتر پرچم IPC__NOWAIT را به صورت تنظیم شده داشته باشد، تابع بدون ارسال پیام برمی گردد و مقدار 1- را به عنوان مقدار بازگشتی برمی گرداند. اگر پارامتر msgflg پرچم IPC__NOWAIT را به صورت پاک داشته باشد، پردازه ارسال کننده پیام معلق خواهد شد و در انتظار فراهم شدن فضا درون صف می ماند.

در صورت موفقیت تابع مقدار 0 و در صورت شکست مقدار 1- را برمی گرداند. در صورت فراخوانی موفقیت آمیز، یک کپی از داده های پیام برداشته می شود و درون صف پیام گذاشته می شود.

msgrcv

تابع msgrcv پیام ها را از یک صف پیام بازیابی می کند.

int msgrcv(int msqid, void *msg_ptr, size_t msg_sz, long int msgtype, int msgflg);

پارامترهای تابع :

  • msqid : شناسه صف پیام است که به وسیله تابع msgget برگردانده می شود.
  • msg__ptr : یک اشاره گر به پیامی است که باید بازیابی شود. همانطور که در قبل اشاره شد، پیام باید با نوع long int شروع شود.
  • msg__sz : سایز پیام مشخص شده به وسیله اشاره گر msg__prt را تعیین می کند. توجه کنید که در محاسبه سایز پیام، نباید سایز long int message__type را دخالت دهید.
  • msgtype : این متغیر که از نوع long int است به ما این اجازه را می دهد که یک فرم ساده ای از اولویت دریافت را پیاده سازی کنیم. اگر msgtype مقدار 0 داشته باشد، اولین پیام موجود در صف بازیابی می شود. اگر مقداری بزرگتر از صفر داشته باشد، اولین پیام که نوعش (اولویتش) مشابه مقدار این پارامتر است، بازیابی می شود. اگر مقدار کوچک تر از صفر باشد، اولین پیام که نوعش (اولویتش) برابر یا کوچکتر از قدر مطلق مقدار msgtype است بازیابی می شود.
  • msgflg : وقتی هیچ پیامی با نوع (اولویت) مناسب در انتظار دریافت شدن نباشند، این پارامتر مشخص می کند که چه اتفاقی رخ بدهد. اگر پرچم IPC__NOWAIT در msgflg تنظیم شده باشد، تابع فراخوانی شده بلافاصله با مقدار برگشتی 1- برمی گردد. اگر پرچم IPC__NOWAIT پاک شده باشد، پردازه معلق شده و منتظر رسیدن یک پیام با اولویت مناسب می ماند.

در صورت موفقیت، تابع msgrcv تعداد بایت های قرار گرفته درون بافر را بر می گرداند؛ همچنین پیام درون بافری که کاربر تخصیص داده است (همان فضایی که پارامتر msg__ptr به آن اشاره می کند) کپی شده و سپس از صف پیام حذف می شود. در صورت بروز خطا 1- برگردانده می شود.

msgctl

عملکرد این تابع بسیار مشابه تابع shmctl در حافظه اشتراکی است. به همین جهت تنها به ذکر نام آن بسنده می کنیم.

int msgctl(int msqid, int command, struct msqid_ds *buf);

درمقاله بعد چگونگی استفاده از Pipeها و Named Pipeها در لینوکس را بررسی می کنیم. ItPro باشید!

نویسنده: رامین غلامی تقی زاده

منبع: انجمن تخصصی فناوری اطلاعات ایران

هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد

#ارتباط_میان_پردازه_ای #ipc_در_لینوکس #صف_پیام
عنوان
1 IPC (ارتباط میان پردازه ای) در لینوکس - قسمت اول رایگان
2 IPC (ارتباط میان پردازه ای) در لینوکس - قسمت دوم رایگان
3 IPC (ارتباط میان پردازه ای) در لینوکس - قسمت سوم رایگان
4 IPC (ارتباط میان پردازه ای) در لینوکس - قسمت چهارم رایگان
5 IPC (ارتباط میان پردازه ای) در لینوکس - قسمت پنجم رایگان
6 IPC (ارتباط میان پردازه ای) در لینوکس - قسمت ششم رایگان
7 IPC (ارتباط میان پردازه ای) در لینوکس - قسمت هفتم رایگان
زمان و قیمت کل 0″ 0
0 نظر

هیچ نظری ارسال نشده است! اولین نظر برای این مطلب را شما ارسال کنید...

نظر شما
برای ارسال نظر باید وارد شوید.
از سرتاسر توسینسو
تنظیمات حریم خصوصی
تائید صرفنظر
×

تو می تونی بهترین نتیجه رو تضمینی با بهترین های ایران بدست بیاری ، پس مقایسه کن و بعد خرید کن : فقط توی جشنواره پاییزه می تونی امروز ارزونتر از فردا خرید کنی ....