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

ساختن یک پروسه ی فرزند برای یک پروسه در لینوکس و نحوه ی ارسال داده ها بین آنها

تاریخ:سه شنبه 12 اردیبهشت 1391-08:17 ق.ظ

به نام خدا
برای این کار از تابع fork() در لینوکس استفاده می شه که هیچ آرگومانی رو دریافت نمی کنه ولی خوب  مقدار بازگشتیش
id پردازه ی فرزند هست برای پردازه ی والد و صفر هست برای خود پردازه ی تازه تولید شده.
برای کد نویسی در این راستا ما باید یک کد برای هر دوی این دو پردازه بنویسیم و از طریق مقدار بازگشتی این تابع fork پردازه ی والد رو از فرزند شناسایی کنیم.
برای ارسال داده ها در این موقعیت یکی از راه ها ارسال داده ها با پایپ لاین هستش که این خودش رو نوع داره.
یکی ارسال از طریق پایپ معمولی و دیگری از طریق پایپ نامدار هستش که نوع اول فقط یک نفر باید فرستنده باشه و دیگری دریافت کننده و در اصل دو طرفه نیست. این از طریق تابع pipe() ساخته میشه.
ولی پایپ نامدار دو طرفه است ولی در لینوکس half duplex هستش به این مفهوم که در آن واحد فقط یک طرف می تونه ارسال داده و دیگری دریافت داشته باشه.
نکته ی دیگری که در این مورد هستش اینه که وقتی یک پردازه پایپ نامدار رو برای read  کردن باز می کنه در آنجا block  میشه که به نحوی میشه از این کار جلوگیری کرد که در ادامه میگم.
برای ساختن یک پایپ نامدار می شه از رو راه استفاده کرد :
1.ساختن اون از طریق shell
$mknode namedpipe_name p
یا
$mkfifo namedpipe_name
که راستی این نکته هم مهمه که در لینوکس به این نوع پایپ fifo  میگن چرا که مثل یک صف عمل می کنه
این نوع پایپ یک فایل در اصل هستش که در این موقع یعنی یعد از ساخت باید سطح دسترسی اون رو تنظیم کرد.
ولی به طور خودکار به صورت زیر هستش:
همان طور که می دونیم این flag های کنترلی در لینوکس 3 دسته هستن:1.برای صاحب اون فایل 2.برای گروه 3.برای افراد دیگر
در این مورد id سازنده ی اون فایل به این پایپ اختصاص داده میشه id گروه اون به این فایل داده میشه و id دایرکتوری والد این فایل به این فایل اختصاص داده میشه.
2. برای ساختن این فایل در کد برنامه نویسی باید از تابع mkfifo() استفاده کنید که آرگومان اول اشاره گری از نوع const به این مکان این فایل می باشد و دومی سطح دسترسی به اون فایل می باشد.
برای استفاده از این پایپ باید اون رو با استفاده  از توابع open() و یا fopen() باز کرد که در صورت استفاده از اولی مقدار بازگشتی یک توصیفگر هستش و اگر از دومی استفاده کنید به شما یک اشاره گر به اون فایل رو بر می گردونه و در زمان باید نحوه ی باز کردن اون رو هم مشخص کنید که برای خواندن هستش یا برای نوشتن
ما نمی تونیم یک فایل رو هم برای خواندن و هم برای نوشتن باز کنید در این مورد استفاده از پایپ لاین نامدار.
برای موردی هم که گفتم برای جلوگیری از block شدن یک پردازه در زمان باز شدن برای خواندن از یک فلگ به نام O_NONBLOCK در زمان باز کردن اون فایل استفاده می کنیم.
خوب امیدوارم چیزهای بدرد بخوری بوده باشه این مطالب موفق باشید.