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

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

#include  <stdio.h>
#include  <signal.h>


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  <stdio.h>
#include  <signal.h>


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  <stdio.h>
#include  <signal.h>


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  <stdio.h>
#include  <signal.h>
#include <stdio.h>

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  <stdio.h>
#include  <signal.h>
#include <stdio.h>

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<stdio.h>
#include<signal.h>
#include<stdio.h>
#include<pthread.h>
#include<stdio.h>

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");
}


نویسنده : بیات

منبع : ITPRO

هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد

#زبان_برنامه_نویسی_c_در_لینوکس #سیگنال_ها_در_زبان_برنامه_نویسی_c #سیگنالها_در_برنامه_نویسی_سی #سیگنال_ها_در_برنامه_نویسی_c #برنامه_نویسی_لینوکس #سیگنالها_در_برنامه_نویسی_c #برنامه_نویسی_c_در_linux #آموزش_برنامه_نویسی_c_در_لینوکس
0 نظر

هیچ نظری ارسال نشده است! اولین نظر برای این مطلب را شما ارسال کنید...

نظر شما
برای ارسال نظر باید وارد شوید.
از سرتاسر توسینسو
تنظیمات حریم خصوصی
تائید صرفنظر
×

تو می تونی بهترین نتیجه رو تضمینی با بهترین های ایران بدست بیاری ، پس مقایسه کن و بعد خرید کن : فقط توی جشنواره تابستانه می تونی امروز ارزونتر از فردا خرید کنی ....