PDA

نسخه کامل مشاهده نسخه کامل : پر کردن یک بافر با ای دی پدر



آرام جان گل
11-03-2007, 19:02
سلام
1-اگر من یک بافر داشته باشم از نوع int چطوری با ای دی پدر که از طریق تابع getppid بدست میاد پرش کنم؟


2- قبل از اینکه فرایند پدر بافر را با ای دی خودش پر کنه باید سیگنالی به تمام پروسس ها بفرسته که اجازه دسترسی به بافر را به آنها ندهد

این کد ها در حقیقت در فاز پدر قرار دارد و اطلاعات بافر را در خروجی نشان می دهد و لی من می خوام که با این کد ها بافر را با ای دی پدر پر کنه

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

این کار با semaphore ایجاد میشه یا با ید با کد نویسی انجام بشه؟
در هر کدام از صورتها کمی توضیح با یک مثال بزنید

3- همین اتفاق هم برای فرایند فرزند بیفته فقط فرایند فرزند فقط از بافر بخونه
مرسی
راهنمایی کنید

someone
12-03-2007, 00:58
دوباره سلام.
-----------------------------------------------------------------------------------------------------------------------
دوست من! این پست در ادامه پستهای قبلی هست. خواهشا سوال ها رو در ادامه یکی از
پست ها دنبال کنید و پست جدید باز نکنین. ممنون از توجهتون.
-----------------------------------------------------------------------------------------------------------------------
در مورد سوالتون فکر کنم برداشت شما از بافر زیاد صحیح نیست. بافر نوعی حافظه ی موقت هست
برای نگه داری اطلاعات. شما به راحتی میتونید از یک متغییر برای نگه داری ID استفاده کنید. یک متغییر
از نوع int .
فکر میکنم در مورد Semaphore هنوز ابهاماتی وجود داره. شما به این شکل در نظر بگیرید که میتونید
با استفاده از Semaphore قسمتی از برنامه رو lock و یا unlock کنین. خب به این صورت وقتی قرار در این بافر
یا متغییر Parent-ID ریخته بشه مقدار Semaphre یکی کم میشه. کافی مقدار Semaphore در این حالت 0 باشه
تا اجازه نده باقی process ها به بافر دسترسی داشته باشن. بعد از پایان کار مقدار Semaphpre رو یکی زیاد
میکنیم به این صورت بافر unloack میشه وprocess بعدی میتونه از بافر بخونه.
برای راحتی کار دو تابع lock و unlock رو به برنامه اضافه کنید. مثلا به شکل زیر :

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

خب کدتون میتونه مثلا به این شکل باشه :

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
باید یک semaphore ایجاد کنید و به اون مقدار 1 بدید.من در نظر گرفتم که این Semaphre یک ID داشته باشه
مثلا 200 که برابر MYID هست.
کافیه کمی روش کار کنید. فکر میکنم بهتر باشه اول الگوریتم کار رو پیاده کنید و بعد کد رو بنویسید.

آرام جان گل
13-03-2007, 11:30
سلام

من قصد نداشتم كه كاري كنم كه شما مرتب به من تذكر دهيد فقط احساس كردم اگر در همين تاپيك بنويسم شما سراغ تاپيك هاي قبلي نميرويد

باز هم يك سوال :

شما گفتيد كه سمافور با صفر شدن بافر را قفل مي كند . من كه هر چي نگاه كردم فقط ديدم كه گزينه sem_op را -1 كرده ايد .
آيا منظورتان همينه؟ يعني اين مقدار را با sem_op<0 مي سنجد؟ و بعد بافر را قفل مي كند؟

بابت اين مدت كه راهنمايي كرديد ممنون

someone
13-03-2007, 16:28
دوباره سلام.
ممنون از توجهتون و ضمنا خواهش میکنم کاری نکردم.
در مورد Semaphore که بحث کردیم گفته شد که یک شمارنده هست. درسته؟
و خب این شمارنده یک مقدار اولیه داره. مثلا 2 و یا هر عدد دیگه ای. خب با استفاده از وقتی از
sem_op استفاده میکنین و اونرو مثلا -1 مقدار میدین به این معنی هست که مقدار Semaphore یکی
کم میشه. مثلا از 2 به 1 تغییر میکنه و وقتی مقدار sem_op برابر با 1 مقدار Sem یکی زیاد میشه یعنی
دوباره میشه 2.
وقتی مقدار Semaphore برابر 2 باشه به این معنی هست که همزمان دو process میتونن به بافر دسترسی
داشته باشن. برای کاری که شما میخواین انجام بدید چون در هر لحظه تنها یک Process با بافر در حال تعامل
هست کافی مقدار Semaphore برابر با 1 باشه. طبق چیزایی که گفته sem_op=-1 این مقدار رو به صفر تبدیل
میکنه (lock) و sem_op=1 دوباره این مقدار رو به 1 برمیگردونه.(unlock)
اگه مشکلی پیش اومد اطلاع بدید.
موفق باشین.

آرام جان گل
13-03-2007, 22:14
سلام

مي خوام چند تا پروسس تعريف كنم چطوري؟

يعني اين طوري توي يك حلقه ؟ فكر نمي كنيد كه خيلي ساده است؟


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

يا اين كه طور ديگري چند تا پروسس تعريف كنم؟

به هر صورتي كه هست توضيح دهيد .

دومين مشكل:
مي خوام يكي از اين پروسس هاي تعريف شده به عنوان بافر عمل كنه. اصلا براي پروسس ها بدنه تعريف مي كنن؟
من بلد نيستم بدنه يك پروسس را تعريف كنم و اون را به عنوان يك بافر تعريف كنم

شايد بتونيم اين كار را با يك share memory انجام بديم . نظر شما چيه ؟ يعني به جاي اينكه پروسس بافر باشه از يك حافظه مشترك استفاده كنيم


سومين مشكل :

سمافر ها به طور كلي دسترسي به بافر خود سيستم را قفل مي كنن و يا هر حافظه اي ما تعريف كرده باشيم
مثلا اگر من يك آرايه هم تعريف كنم ان را هم قفل مي كند؟

مرسي
راهنمايي كنيد

someone
14-03-2007, 02:01
دوباره سلام.
بله کدتون درسته! اگرچه ساده هست. (البته یک مشکل کوچیک داره )

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
ولی پیشنهاد میکنم به صورت زیر تابعی براش بنویسید :

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
در مورد دوم پیشنهادتون کاملا درسته. بهتره از یک بافر مشترک استفاده بشه.
در مورد سوم ببینید Semaphore اصلا به بافر مربوط نمیشه. قسمتی از برنامه که بین lock و unlock هست
(دو تابعی که در موردش صحبت کردیم.) قفل میشه. حالا هر چی که میخواد باشه.
مثلا فرض کنید شما یک شمارنده تعریف کردید (int counter = 0 ) و میخواید هر process اون رو یکی زیاد کنه.
این متغییر رو برای هر process بین lock و unlock قرار میدین. و به طور کلی هر چیز دیگه ای.
بنابراین Semaphore قسمتی از برنامه رو که میخواین رو قفل میکنه.

آرام جان گل
14-03-2007, 15:01
سلام
من با كمك شما يك كد نوشته ام واز شما مي خوام كه نظارت كنيد:rolleye:

كد من :

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

1-آيا آرايه buf را درست سراسري تعريف كرده ام مي خواستم كه هم براي تابع buf و هم براي main در دسترس باشه.

2- آيا تابع هاي semget , semctl را درست نوشته ام؟ وروديها منظورمه و اين كه قبل از ساخت پروسس ان را ساختم و مقدار دهي كردم؟

3- من در حقيقت اين كار را كردم كه اول پروسس ايجاد شود و به تابع buf دست يابد و همون جا در تابع buf تابع sem_lock صدازده شود و اين تابع منحصرا براي اين پروسس استفاده شود و يا بخواند و يا بنويسد و بعد از خارج شدن از تابع buf و قرار گرفتن در تابع مين sem_unlock صدا زده شود و براي بقيه پروسس تابع buf آراد شود.

درست عمل كردم يا اين كه sem_lock راهم در تايع main بنويسم؟


لطفا اگر ايراد ديگري هم داره به من بگيد
مرسي

someone
15-03-2007, 00:03
دوباره سلام.
در مورد بافر باید ازشما سوالی داشتم. چرا به صورت Array تعریفش کردید؟ برای این کار دلیل خاصی دارین؟
کافیه به این صورت نوشته بشه :

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
شما یک Semaphore ایجاد کردید با ID ای که مقدارش 100 هست و اون رو با 1 مقدار دهی کردید.
کاملا درسته. در مورد lock کردن من پیشنهاد میکنم که از sem_lock و sem_unlock در یک تابع استفاده کنید.
یا در main و یا در buf . اما نکته ای که رعایت کردید خیلی مهم هست. "بعد از نمایش بافر در خروجی باید
بافر unlock بشه." که به درستی به این نکته دقت کردین.
اما چند مورد وجود داره :

به این دو کد دقت کنین :

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

در اینجا اگه pid برابر با 0 باشه برای [0]buf چه اتفاقی میافته؟ چه مقداری در خروجی چاپ میشه؟
می بینید که بافر رو مقداردهی نکردید و چیزی در اون نیست. ( یک runtime-error )
راستی چرا مقدار pid رو برای بزرگتر از 0 چک میکنید؟ (اگرچه ممکنه اتفاق بیافته.) مقدار برگشتی تابع
fork برابر با Child-Process-ID نیست. برای گرفتن ID ای که Child-Process جدید داره باید از getpid
استفاده کنید.
اینکه تابعی برای پر کردن buf نوشتید کار کاملا درستی هست. اما دلیلی نداره که هم pid و هم ppid رو به
عنوان آرگومان بگیرید. یک تابع با یک آرگومان(از نوع int ) برای این کار بنویسید.
در مورد lock وunlock کردن به این شکل عمل کنین. ( یه پیشنهاد )

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
مشخص هست که الگوریتم کار رو درست گرفتید. اما کمی پیاده سازی کدتون مشکل داره.

آرام جان گل
15-03-2007, 09:54
سلام

من با اجرا گرفتن هم كمي مشكل دارم .

من در محيط لينوكس يك text از طريق application انتخاب مي كنم وكد هايم را مي نويسم و با پسوند .c ذخيره مي كنم و بعد روي صفحه دسك تاپ راست كليك مي كنم و گزينه open terminal را مي زنم و بعد در اين محيط تايپ مي كنم:

gcc h.c -o h $ ولي اجرا نمي گيره فكر مي كنم كه دستور gcc را نمي شناسه چون پيغام مي ده
gcc: command not found

اگه در اين مورد هم كمكم كنيد يك دنيا ممنون

مرسي.

آرام جان گل
15-03-2007, 10:23
لطفا در مورد اين توابع و آرگومانها ي ين توضيح دهيد

ممنون ميشم .


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید


مرسي مرسي

آرام جان گل
15-03-2007, 12:46
سلام

1-اگر من يك struc بخام به صورت سراسري تعريف كنم كه براي تمام توابع قابل دسترسي باشه با يد اين طوري تعريف كنم

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
يعني بايد با #define بنويسم


2-چون برنامه من مقدار خروجي نداره بايد main را اين طوري بنويسم؟


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

3- 0066 در semget چيه؟

گزينه هاي داخل struct براي چيه/

someone
16-03-2007, 01:48
دوباره سلام.
همون struct کافیه و نباید از defile# استفاده کنین.

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
ضمنا باید نوع ها رو هم مشخص کنین. مثلا semnum از نوع int هست و باید کامل تعریف بشه.مثلا

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
فقط structure رو قبل از تابع main تعریف کنین. که شکل کامل تعریفش به این صورت میشه :

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
در مورد سوال دوم :کاملا درسته از نوع void باید باشه.
در مورد سوال سوم : آرگومان سوم یک flag (پرچم) هست برای اینکه semaphore مورد نظر به چه شکل ایجاد
بشه. بهتره از این ترکیب استفاده کنید.

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
----------------------------------------------------------------------------------------------------------
در مورد این سه کد قبلا صحبت کردیم :
برای ایجاد یک semaphore با ID برابر 100 استفاده میشه.

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

semaphore ی که ایجاد شده رو با عدد 1 مقدار دهی میکنه. (SETVAL باید uppercase باشه)

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
برای استفاده از semaphore ایجاد شده و تغییر مقدار اون (زیاد کردن ویا کم کردن مقدار برای lock و یا unlock)
استفاده میشه. که در اینجا sem_set_id برابر 100 هست.

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

آرام جان گل
16-03-2007, 22:51
سلام

از لطف شما و صبر وتحمل شما و جوابهاي شما متشكرم و خوشحالم كه در اين سايت عضوم و باز هم خوشحالم كه افرادي مثل شما بدون چشم داشت و با صبر كمك مي كنند

سال خوبي رو براي شما و خانواده شما آرزومندم;) :38:

someone
17-03-2007, 01:31
دوباره سلام.
خواهش میکنم . من کاری نکردم.
امیدوارم شما هم در درس و زندگیتون موفق باشین.
اگه مشکلی پیش اومد خوشحال میشم بتونم کمکی کنم.