آموزش سیگنال ها در برنامه نویسی زبان C

من این رو به عنوان پرسشی بیان کردم کسی پاسخی نداد سپس خودم پاسخش روافتم بهتر دیدم این رو خودم اینجا به عنوان اموزش بزارم برای همه.میخایم سیگنال ی یا اینتراپتی به ماداده بشه دریک زمان خاص مثلا هر ده ثانیه یکبار یا هرچیز دیگه ای ....مانمیخایم باسرکشی این کارروبکنیم .یکی ازکارهااینهه یک ریسمان در زبان سی بسازیم که هربار زمان روبرسی کنه اگه بیست ثانیه از یک زمانی خاص گذشته بود یک تابعی رواجرا کنه اما اینحوریه وقت سی پی یو گرفته میشه.

دوره های شبکه، برنامه نویسی، مجازی سازی، امنیت، نفوذ و ... با برترین های ایران

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



نظرات