"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > كيفية التعامل مع المقاطعات Ctrl-C بأمان في لغة C++ باستخدام وظيفة Sigaction؟

كيفية التعامل مع المقاطعات Ctrl-C بأمان في لغة C++ باستخدام وظيفة Sigaction؟

تم النشر بتاريخ 2024-11-17
تصفح:595

How to Gracefully Handle Ctrl-C Interrupts in C   with the Sigaction Function?

اعتراض أحداث Ctrl-C في لغة C

يعد اعتراض أحداث Ctrl-C مهمة ضرورية في البرمجة، خاصة عندما تريد الاستجابة برشاقة لـ انقطاعات غير متوقعة.

استخدام Sigaction في لغة C، يعد استخدام وظيفة sigaction للتعامل مع الإشارات أكثر موثوقية. بناء الجملة كما يلي:

int sigaction(int Signum, const struct sigaction *act, struct sigaction *oldact);

int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);

signum: to تتم معالجة رقم الإشارة، لـ Ctrl-C، SIGINT.
  • act: يحدد إجراء معالج الإشارة الجديد.
  • oldact: يخزن السلوك السابق.
  • في المثال الذي قدمه توماس، تكون بنية sigaction كما يلي:

struct sigaction sigIntHandler; sigIntHandler.sa_handler = my_handler; sigemptyset(&sigIntHandler.sa_mask); sigIntHandler.sa_flags = 0;

int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);

sa_handler: يشير إلى وظيفة المعالج.
  • sa_mask: قناع الإشارة لمنع أثناء معالجة هذه الإشارة.
  • sa_flags: أعلام إضافية، عادةً ما تكون 0.
  • استخدم بنية sigaction هذه مع إشارة SIGINT:

sigaction (SIGINT، &sigIntHandler، NULL)؛

sigaction(SIGINT, &sigIntHandler, NULL);
وظيفة المعالج

أخيرًا، أنت بحاجة إلى وظيفة معالج للرد على الإشارة. في المثال، يقوم my_handler فقط بطباعة رسالة والخروج من البرنامج:

void my_handler(int s){ printf("الإشارة التي تم التقاطها %d\n", s); خروج (1)؛

void my_handler(int s){
   printf("Caught signal %d\n", s);
   exit(1);
}
الكود الكامل

ما يلي هو الكود الكامل الذي يستخدم sigaction لالتقاط أحداث Ctrl-C:

#include #تشمل #تشمل #تشمل باطلة my_handler (int s) { printf("الإشارة التي تم التقاطها %d\n",s); خروج (1)؛ } إنت الرئيسي (إنت أرجك، شار ** أرجف) { struct sigaction sigIntHandler; sigIntHandler.sa_handler = my_handler; sigemptyset(&sigIntHandler.sa_mask); sigIntHandler.sa_flags = 0; sigaction(SIGINT, &sigIntHandler, NULL); يوقف()؛ العودة 0؛

#include 
#include 
#include 
#include 

void my_handler(int s){
           printf("Caught signal %d\n",s);
           exit(1); 

}

int main(int argc,char** argv)
{

   struct sigaction sigIntHandler;

   sigIntHandler.sa_handler = my_handler;
   sigemptyset(&sigIntHandler.sa_mask);
   sigIntHandler.sa_flags = 0;

   sigaction(SIGINT, &sigIntHandler, NULL);

   pause();

   return 0;    
}
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3