تبلیغات :
ماهان سرور
آکوستیک ، فوم شانه تخم مرغی ، پنل صداگیر ، یونولیت
دستگاه جوجه کشی حرفه ای
فروش آنلاین لباس کودک
خرید فالوور ایرانی
خرید فالوور اینستاگرام
خرید ممبر تلگرام

[ + افزودن آگهی متنی جدید ]




صفحه 1 از 2 12 آخرآخر
نمايش نتايج 1 به 10 از 14

نام تاپيک: پر کردن یک بافر با ای دی پدر

  1. #1
    داره خودمونی میشه
    تاريخ عضويت
    Mar 2007
    پست ها
    195

    پيش فرض پر کردن یک بافر با ای دی پدر

    سلام
    1-اگر من یک بافر داشته باشم از نوع int چطوری با ای دی پدر که از طریق تابع getppid بدست میاد پرش کنم؟


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

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

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

  2. #2
    حـــــرفـه ای
    تاريخ عضويت
    Aug 2006
    پست ها
    793

    پيش فرض

    دوباره سلام.
    -----------------------------------------------------------------------------------------------------------------------
    دوست من! این پست در ادامه پستهای قبلی هست. خواهشا سوال ها رو در ادامه یکی از
    پست ها دنبال کنید و پست جدید باز نکنین. ممنون از توجهتون.
    -----------------------------------------------------------------------------------------------------------------------
    در مورد سوالتون فکر کنم برداشت شما از بافر زیاد صحیح نیست. بافر نوعی حافظه ی موقت هست
    برای نگه داری اطلاعات. شما به راحتی میتونید از یک متغییر برای نگه داری ID استفاده کنید. یک متغییر
    از نوع int .
    فکر میکنم در مورد Semaphore هنوز ابهاماتی وجود داره. شما به این شکل در نظر بگیرید که میتونید
    با استفاده از Semaphore قسمتی از برنامه رو lock و یا unlock کنین. خب به این صورت وقتی قرار در این بافر
    یا متغییر Parent-ID ریخته بشه مقدار Semaphre یکی کم میشه. کافی مقدار Semaphore در این حالت 0 باشه
    تا اجازه نده باقی process ها به بافر دسترسی داشته باشن. بعد از پایان کار مقدار Semaphpre رو یکی زیاد
    میکنیم به این صورت بافر unloack میشه وprocess بعدی میتونه از بافر بخونه.
    برای راحتی کار دو تابع lock و unlock رو به برنامه اضافه کنید. مثلا به شکل زیر :
    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
    خب کدتون میتونه مثلا به این شکل باشه :
    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
    باید یک semaphore ایجاد کنید و به اون مقدار 1 بدید.من در نظر گرفتم که این Semaphre یک ID داشته باشه
    مثلا 200 که برابر MYID هست.
    کافیه کمی روش کار کنید. فکر میکنم بهتر باشه اول الگوریتم کار رو پیاده کنید و بعد کد رو بنویسید.

  3. #3
    داره خودمونی میشه
    تاريخ عضويت
    Mar 2007
    پست ها
    195

    پيش فرض كم و زياد كردن سمافور

    سلام

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

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

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

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

  4. #4
    حـــــرفـه ای
    تاريخ عضويت
    Aug 2006
    پست ها
    793

    پيش فرض

    دوباره سلام.
    ممنون از توجهتون و ضمنا خواهش میکنم کاری نکردم.
    در مورد 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)
    اگه مشکلی پیش اومد اطلاع بدید.
    موفق باشین.

  5. #5
    داره خودمونی میشه
    تاريخ عضويت
    Mar 2007
    پست ها
    195

    پيش فرض process

    سلام

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

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

    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
    يا اين كه طور ديگري چند تا پروسس تعريف كنم؟

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

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

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


    سومين مشكل :

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

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

  6. #6
    حـــــرفـه ای
    تاريخ عضويت
    Aug 2006
    پست ها
    793

    پيش فرض

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

  7. #7
    داره خودمونی میشه
    تاريخ عضويت
    Mar 2007
    پست ها
    195

    پيش فرض كد من

    سلام
    من با كمك شما يك كد نوشته ام واز شما مي خوام كه نظارت كنيد

    كد من :
    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
    1-آيا آرايه buf را درست سراسري تعريف كرده ام مي خواستم كه هم براي تابع buf و هم براي main در دسترس باشه.

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

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

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


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

  8. #8
    حـــــرفـه ای
    تاريخ عضويت
    Aug 2006
    پست ها
    793

    پيش فرض

    دوباره سلام.
    در مورد بافر باید ازشما سوالی داشتم. چرا به صورت 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 کردن به این شکل عمل کنین. ( یه پیشنهاد )
    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
    مشخص هست که الگوریتم کار رو درست گرفتید. اما کمی پیاده سازی کدتون مشکل داره.

  9. #9
    داره خودمونی میشه
    تاريخ عضويت
    Mar 2007
    پست ها
    195

    پيش فرض اجرا گرفتن

    سلام

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

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

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

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

    مرسي.

  10. #10
    داره خودمونی میشه
    تاريخ عضويت
    Mar 2007
    پست ها
    195

    پيش فرض semaphore

    لطفا در مورد اين توابع و آرگومانها ي ين توضيح دهيد

    ممنون ميشم .

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

    مرسي مرسي

صفحه 1 از 2 12 آخرآخر

Thread Information

Users Browsing this Thread

هم اکنون 1 کاربر در حال مشاهده این تاپیک میباشد. (0 کاربر عضو شده و 1 مهمان)

User Tag List

قوانين ايجاد تاپيک در انجمن

  • شما نمی توانید تاپیک ایحاد کنید
  • شما نمی توانید پاسخی ارسال کنید
  • شما نمی توانید فایل پیوست کنید
  • شما نمی توانید پاسخ خود را ویرایش کنید
  •