یک برنامهٔ ساده به زبان C بنویسید که با استفاده از هدر signal.h و تابع raise سیگنال SIGALRM را ارسال کند، یک handler برای آن ثبت کند که یک شمارندهٔ وقفه را افزایش دهد و در حلقهٔ اصلی برنامه مقدار شمارنده را هر ثانیه چاپ کند.
16.0 بازدید آخرین ویرایش در 198 روز قبل ساعت 03:20 0.0
برای حل این مسئله هدرهای مورد نیاز (مثل signal.h، stdio.h و unistd.h) را اضافه کنید، یک متغیر از نوع volatile sig_atomic_t برای شمارنده تعریف کنید، یک تابع handler بنویسید که تنها شمارنده را افزایش دهد و آن را با signal(SIGALRM, handler) ثبت کنید؛ سپس از تابع raise(SIGALRM) برای شبیهسازی وقوع سیگنال فراخوانی کنید و در حلقهٔ اصلی با sleep(1) مقدار شمارنده را چاپ کنید. نکات: در handler از توابعی که در context سیگنال ایمن نیستند (مثل printf) استفاده نکنید و به جای آن فقط یک فلگ یا sig_atomic_t تغییر دهید یا از write برای چاپ مستقیم استفاده کنید؛ این روش برای درک مدیریت وقفهها در سیستمهای بلادرنگ و سیستمهای توکار مفید است، و میتوانید با gcc برنامه را کامپایل و اجرا کنید.
1 پاسخ
جدید ترین قدیمی ترین بالاترین امتیاز پاسخ های من
در حال بارگیری...
برای ارسال پاسخ باید با حساب کاربری وارد شوید.
ورود به حساب کاربری
در handler فقط متغیر volatile sig_atomic_t را تغییر دهید و از توابع ناامن در context سیگنال (مانند printf یا malloc) اجتناب کنید. برای ثبت سیگنال بهتر است از sigaction استفاده کنید تا رفتار قابل پیشبینیتری (مثل تعیین mask یا پاک کردن SA_RESTART) داشته باشید. اگر میخواهید وقوع سیگنال را شبیهسازی کنید از raise استفاده کنید، ولی برای تولید دورهای بهتر است از alarm یا timer_create استفاده کنید و برای چاپ هر ثانیه در حلقهٔ اصلی از sleep(1) بهره ببرید.
گزارش