تور لحظه آخری
امروز : سه شنبه ، 20 شهریور 1403    احادیث و روایات:  پیامبر اکرم (ص):به کوچکی گناه نگاه نکنید بلکه به چیزی [نافرمانی خدا] که برآن جرات یافته اید بنگ...
سرگرمی سبک زندگی سینما و تلویزیون فرهنگ و هنر پزشکی و سلامت اجتماع و خانواده تصویری دین و اندیشه ورزش اقتصادی سیاسی حوادث علم و فناوری سایتهای دانلود گوناگون شرکت ها




آمار وبسایت

 تعداد کل بازدیدها : 1814692573




هواشناسی

نرخ طلا سکه و  ارز

قیمت خودرو

فال حافظ

تعبیر خواب

فال انبیاء

متن قرآن



اضافه به علاقمنديها ارسال اين مطلب به دوستان آرشيو تمام مطالب
archive  refresh

پر کردن یک بافر با ای دی پدر


واضح آرشیو وب فارسی:سایت ریسک: View Full Version : پر کردن یک بافر با ای دی پدر آرام جان گل11-03-2007, 07:02 PMسلام 1-اگر من یک بافر داشته باشم از نوع int چطوری با ای دی پدر که از طریق تابع getppid بدست میاد پرش کنم؟ 2- قبل از اینکه فرایند پدر بافر را با ای دی خودش پر کنه باید سیگنالی به تمام پروسس ها بفرسته که اجازه دسترسی به بافر را به آنها ندهد این کد ها در حقیقت در فاز پدر قرار دارد و اطلاعات بافر را در خروجی نشان می دهد و لی من می خوام که با این کد ها بافر را با ای دی پدر پر کنه close(fd[0]); if ((fdin = open(argv[1],O_RDONLY))<0) { perror("open"); write (fd[1],"123 ",4); } else { while((len = read (fdin , buf, BUFSZ))>0) { write(fd[1],buf, len); close(fdin); } close(fd[1]); این کار با semaphore ایجاد میشه یا با ید با کد نویسی انجام بشه؟ در هر کدام از صورتها کمی توضیح با یک مثال بزنید 3- همین اتفاق هم برای فرایند فرزند بیفته فقط فرایند فرزند فقط از بافر بخونه مرسی راهنمایی کنید someone12-03-2007, 12:58 AMدوباره سلام. ----------------------------------------------------------------------------------------------------------------------- دوست من! این پست در ادامه پستهای قبلی هست. خواهشا سوال ها رو در ادامه یکی از پست ها دنبال کنید و پست جدید باز نکنین. ممنون از توجهتون. ----------------------------------------------------------------------------------------------------------------------- در مورد سوالتون فکر کنم برداشت شما از بافر زیاد صحیح نیست. بافر نوعی حافظه ی موقت هست برای نگه داری اطلاعات. شما به راحتی میتونید از یک متغییر برای نگه داری 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 AMسلام من قصد نداشتم كه كاري كنم كه شما مرتب به من تذكر دهيد فقط احساس كردم اگر در همين تاپيك بنويسم شما سراغ تاپيك هاي قبلي نميرويد باز هم يك سوال : شما گفتيد كه سمافور با صفر شدن بافر را قفل مي كند . من كه هر چي نگاه كردم فقط ديدم كه گزينه sem_op را -1 كرده ايد . آيا منظورتان همينه؟ يعني اين مقدار را با sem_op<0 مي سنجد؟ و بعد بافر را قفل مي كند؟ بابت اين مدت كه راهنمايي كرديد ممنون someone13-03-2007, 04:28 PMدوباره سلام. ممنون از توجهتون و ضمنا خواهش میکنم کاری نکردم. در مورد 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, 10:14 PMسلام مي خوام چند تا پروسس تعريف كنم چطوري؟ يعني اين طوري توي يك حلقه ؟ فكر نمي كنيد كه خيلي ساده است؟ x=5; while (x<0) { if((pid = fork())<0) error } يا اين كه طور ديگري چند تا پروسس تعريف كنم؟ به هر صورتي كه هست توضيح دهيد . دومين مشكل: مي خوام يكي از اين پروسس هاي تعريف شده به عنوان بافر عمل كنه. اصلا براي پروسس ها بدنه تعريف مي كنن؟ من بلد نيستم بدنه يك پروسس را تعريف كنم و اون را به عنوان يك بافر تعريف كنم شايد بتونيم اين كار را با يك share memory انجام بديم . نظر شما چيه ؟ يعني به جاي اينكه پروسس بافر باشه از يك حافظه مشترك استفاده كنيم سومين مشكل : سمافر ها به طور كلي دسترسي به بافر خود سيستم را قفل مي كنن و يا هر حافظه اي ما تعريف كرده باشيم مثلا اگر من يك آرايه هم تعريف كنم ان را هم قفل مي كند؟ مرسي راهنمايي كنيد someone14-03-2007, 02:01 AMدوباره سلام. بله کدتون درسته! اگرچه ساده هست. (البته یک مشکل کوچیک داره ) !!!! برای مشاهده محتوا ، لطفا ثبت نام کنید / وارد شوید !!!! ولی پیشنهاد میکنم به صورت زیر تابعی براش بنویسید : !!!! برای مشاهده محتوا ، لطفا ثبت نام کنید / وارد شوید !!!! در مورد دوم پیشنهادتون کاملا درسته. بهتره از یک بافر مشترک استفاده بشه. در مورد سوم ببینید Semaphore اصلا به بافر مربوط نمیشه. قسمتی از برنامه که بین lock و unlock هست (دو تابعی که در موردش صحبت کردیم.) قفل میشه. حالا هر چی که میخواد باشه. مثلا فرض کنید شما یک شمارنده تعریف کردید (int counter = 0 ) و میخواید هر process اون رو یکی زیاد کنه. این متغییر رو برای هر process بین lock و unlock قرار میدین. و به طور کلی هر چیز دیگه ای. بنابراین Semaphore قسمتی از برنامه رو که میخواین رو قفل میکنه. آرام جان گل14-03-2007, 03:01 PMسلام من با كمك شما يك كد نوشته ام واز شما مي خوام كه نظارت كنيد:rolleye: كد من : #include <stdio.h> #include <stdlib.h> #include <unisdt.h> #include <sys/types.h> # define int buf[1]; // for use in main & other function // --------------------- --------------------- --------------------- void err_quit(char *msg); void sem_lock (int sem_id); void sem_unlock(int sem_id); int buf (int pid , int ppid); // this is my buffer // int main() { int pid , sem_id , res , ppid , printppid , start = 3; sem_id = semget(100,1,0666); if (sem_id <0) err_quit ("semget"); res = semctl (100,0,setval,1); while (start < 0) { if ((pid = fork())<0) err_quit("fork"); else if (pid == 0) { ppid = getppid(); // ا// ين تكه كد الكي است تا ورودي تابع من ايرادي پيدا نكنه printppid = buf(pid , ppid); // بافر را مي خونه ودر printppid قرار مي ده// pintf ("buffer is contain : ",printppid); // نمايش بافر د رخروجي// sem_unlock(100); // آزاد كردن بافر براي بقيه پروسس ها // } else { ppid = getppid(); // براي ذخيره اي دي پدر در بافر// printppid = buf (pid , ppid); printf ("parent process read the buffer"); sem_unlock(100); statr = srart-1; } } } void sem_lock(......) { ..... ..... .... } void sem _ unlock(.....) { .... ..... .... } long buf (int pid , int ppid) { sem_lock(100); if (pid>0) { buf [0] = ppid; return -1; } else if (pid ==0) return buf[0]; } 1-آيا آرايه buf را درست سراسري تعريف كرده ام مي خواستم كه هم براي تابع buf و هم براي main در دسترس باشه. 2- آيا تابع هاي semget , semctl را درست نوشته ام؟ وروديها منظورمه و اين كه قبل از ساخت پروسس ان را ساختم و مقدار دهي كردم؟ 3- من در حقيقت اين كار را كردم كه اول پروسس ايجاد شود و به تابع buf دست يابد و همون جا در تابع buf تابع sem_lock صدازده شود و اين تابع منحصرا براي اين پروسس استفاده شود و يا بخواند و يا بنويسد و بعد از خارج شدن از تابع buf و قرار گرفتن در تابع مين sem_unlock صدا زده شود و براي بقيه پروسس تابع buf آراد شود. درست عمل كردم يا اين كه sem_lock راهم در تايع main بنويسم؟ لطفا اگر ايراد ديگري هم داره به من بگيد مرسي someone15-03-2007, 12:03 AMدوباره سلام. در مورد بافر باید ازشما سوالی داشتم. چرا به صورت 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 AMسلام من با اجرا گرفتن هم كمي مشكل دارم . من در محيط لينوكس يك text از طريق application انتخاب مي كنم وكد هايم را مي نويسم و با پسوند .c ذخيره مي كنم و بعد روي صفحه دسك تاپ راست كليك مي كنم و گزينه open terminal را مي زنم و بعد در اين محيط تايپ مي كنم: gcc h.c -o h $ ولي اجرا نمي گيره فكر مي كنم كه دستور gcc را نمي شناسه چون پيغام مي ده gcc: command not found اگه در اين مورد هم كمكم كنيد يك دنيا ممنون مرسي. آرام جان گل15-03-2007, 10:23 AMلطفا در مورد اين توابع و آرگومانها ي ين توضيح دهيد ممنون ميشم . semget(100,1,0666); semctl (100,0,setval,1); semop(sem_set_id, &sem_op, 1); مرسي مرسي آرام جان گل15-03-2007, 12:46 PMسلام 1-اگر من يك struc بخام به صورت سراسري تعريف كنم كه براي تمام توابع قابل دسترسي باشه با يد اين طوري تعريف كنم # define struct sem_buf { semnum; semop; semflag }; يعني بايد با #define بنويسم 2-چون برنامه من مقدار خروجي نداره بايد main را اين طوري بنويسم؟ void main () 3- 0066 در semget چيه؟ گزينه هاي داخل struct براي چيه/ someone16-03-2007, 01:48 AMدوباره سلام. همون 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, 10:51 PMسلام از لطف شما و صبر وتحمل شما و جوابهاي شما متشكرم و خوشحالم كه در اين سايت عضوم و باز هم خوشحالم كه افرادي مثل شما بدون چشم داشت و با صبر كمك مي كنند سال خوبي رو براي شما و خانواده شما آرزومندم;) :38: someone17-03-2007, 01:31 AMدوباره سلام. خواهش میکنم . من کاری نکردم. امیدوارم شما هم در درس و زندگیتون موفق باشین. اگه مشکلی پیش اومد خوشحال میشم بتونم کمکی کنم. سایت ما را در گوگل محبوب کنید با کلیک روی دکمه ای که در سمت چپ این منو با عنوان +1 قرار داده شده شما به این سایت مهر تأیید میزنید و به دوستانتان در صفحه جستجوی گوگل دیدن این سایت را پیشنهاد میکنید که این امر خود باعث افزایش رتبه سایت در گوگل میشود




این صفحه را در گوگل محبوب کنید

[ارسال شده از: سایت ریسک]
[مشاهده در: www.ri3k.eu]
[تعداد بازديد از اين مطلب: 1576]

bt

اضافه شدن مطلب/حذف مطلب




-


گوناگون

پربازدیدترینها
طراحی وب>


صفحه اول | تمام مطالب | RSS | ارتباط با ما
1390© تمامی حقوق این سایت متعلق به سایت واضح می باشد.
این سایت در ستاد ساماندهی وزارت فرهنگ و ارشاد اسلامی ثبت شده است و پیرو قوانین جمهوری اسلامی ایران می باشد. لطفا در صورت برخورد با مطالب و صفحات خلاف قوانین در سایت آن را به ما اطلاع دهید
پایگاه خبری واضح کاری از شرکت طراحی سایت اینتن