من این رو به عنوان پرسشی بیان کردم کسی پاسخی نداد سپس خودم پاسخش روافتم بهتر دیدم این رو خودم اینجا به عنوان اموزش بزارم برای همه.میخایم سیگنال ی یا اینتراپتی به ماداده بشه دریک زمان خاص مثلا هر ده ثانیه یکبار یا هرچیز دیگه ای ....مانمیخایم باسرکشی این کارروبکنیم .یکی ازکارهااینهه یک ریسمان در زبان سی بسازیم که هربار زمان روبرسی کنه اگه بیست ثانیه از یک زمانی خاص گذشته بود یک تابعی رواجرا کنه اما اینحوریه وقت سی پی یو گرفته میشه.
من این رو به شما پیشکش میکنم تقریبا سعی کردم اسون باشه اموزش.این رو من پیداکردم که براتون میزارم گه بتونیم بهتره که این روبه صورت نخ راه انداخت یعنی به صورت نخ اجراش کنیم.تا بشه کارهای دیگه روهم انجام دادکه برنامه لنگ نزنه.اگه کسی متونه به صورت نخ پیادش کنه خوبه ، باریسمان دز زبان سی بهتره.امامافعلا ساده راهش می ندازیم ببینم چی میشه ازدوستان میخایم که کمک کنند تا کاملش کنیم ، در اینجا alarm که باعدد 2 مشخص شده یعنی پس ازاجرای برنامه یاتابع main دوثانیه بعد تابع alarm فراخوانی بشه.اما این کارنمیده میگم چرا در پایین درستش میکنم
#include #include void ALARMhandler(int sig) { signal(SIGALRM, SIG_IGN); /* ignore this signal */ printf("Hello"); signal(SIGALRM, ALARMhandler); /* reinstall the handler */ } void main(int argc, char *argv[]) { signal(SIGALRM, ALARMhandler); alarm(2); /* set alarm clock */ while (1) ; printf("All done"); }
خب ببینید انگار اینجوریه جایی خوندم داده هادر کش میمونه مگراینکه به انتهای خط برسه پس برای hello باید \n گذاشت که به انتهای خط بپره اما میشه کلا از puts("string"); روبه کارببریم در سرفایل stdio.h که دیگه مشکل printf و رفتن به خط بعدرونداشته باشه.هرچند به کاربردن printf ارلحاظ امنتی کارمناسبی نیست وخطر امینتی داره وبهتره ازهماون puts به کارگیری کرد
#include #include void ALARMhandler(int sig) { signal(SIGALRM, SIG_IGN); /* ignore this signal */ printf("Hello \n"); signal(SIGALRM, ALARMhandler); /* reinstall the handler */ } void main(int argc, char *argv[]) { signal(SIGALRM, ALARMhandler); alarm(2); /* set alarm clock */ while (1) ; printf("All done"); }
اما ببنید مامیخایم هربار این برنامه اجرابشه .پس چه بهتر که بیایم بنویسیم یعنی چی؟ یعنی این دستور به صورت دوره ای کارماروانجام میده
#include #include void ALARMhandler(int sig) { signal(SIGALRM, SIG_IGN); /* ignore this signal */ printf("Hello \n"); signal(SIGALRM, ALARMhandler); /* reinstall the handler */ alarm(2); } void main(int argc, char *argv[]) { signal(SIGALRM, ALARMhandler); alarm(2); /* set alarm clock */ while (1) ; printf("All done"); }
خب نخاستیم دوستان کسی کاری بکنه اینک خودم بازاین رو حل کردم ببنید
#include #include #include void ALARMhandler(int sig) { puts("helllllllllllo") ; alarm(2); } void main(int argc, char *argv[]) { signal(SIGALRM, ALARMhandler); alarm(2); /* set alarm clock */ while (1){ puts("while") ; sleep(2); } printf("All done"); } ــــــــــــــــــــــــــــخروجی while helllllllllllo while helllllllllllo while helllllllllllo while helllllllllllo ..... به همین شکل ادامه پیدامیکنه
بیعنی این تابع خودش مثه نخ هست و موازی اجر میشه پس جای نگرانی نیست و نمیخاد به دنبال نخ ها برید خود ش کار نخ رومیکنه.خب اجازه بدید کار رو کمی بهتر بکنیم به این تابع دقت کنید اینجامیخام بگم در تابعی که هندلر هست میشه یک تابع دیگه هم فراخوانی کرد
#include #include #include void me(){ puts("helllllllllllo") ; } void ALARMhandler(int sig) { me(); alarm(3); } void main(int argc, char *argv[]) { signal(SIGALRM, ALARMhandler); alarm(2); /* set alarm clock */ while (1){ puts("while") ; sleep(2); } printf("All done"); }
اینم برای کسانی که دوست دارن بیشتر بدانند خودم نوشتمش دیگه توضیحی نمیدم اما بادقت بهش نگاه کنید اما برای این برنامه پایانی هنگام کامپایل کردن بااین دستور کامپایل راانجام دهید
% cc main.c -o outputname -lpthread
امابرای برنامه های بالا که ریسمان درانهابه کارنرفته نیازی نیست
#include #include #include #include #include void* print_xs (void* unused){ puts ("thread"); return NULL; } void ALARMhandler(int sig) { alarm(3); pthread_t thread_id; pthread_create(&thread_id , NULL , & print_xs , NULL); } void main(int argc, char *argv[]) { signal(SIGALRM, ALARMhandler); alarm(2); /* set alarm clock */ while (1){ puts("while") ; sleep(2); } printf("All done"); }
زمان پاسخ گویی روز های شنبه الی چهارشنبه ساعت 9 الی 18
فقط به موضوعات مربوط به محصولات آموزشی و فروش پاسخ داده می شود