พื้นฐานสัญญาณ (Signal)
เมื่อโปรแกรมทำงานผิดปกติ สามารถหยุดได้ด้วยปุ่มลัด:
- Ctrl+C: ส่งสัญญาณ SIGINT หยุดโปรแกรมหลังเสร็จ I/O operations
- Ctrl+Z: ส่งสัญญาณ SIGTSTP หยุดโปรแกรมทันที ทรงพลังกว่า SIGINT
ในภาษา C สามารถจัดการสัญญาณเหล่านี้ได้ด้วยฟังก์ชัน signal()
โจทย์
เขียนโปรแกรมที่ข้ามการหยุดจาก Ctrl+Z แทนที่จะหยุด ให้พิมพ์ "Ctrl+Z cannot suspend this code"
โค้ดภาษา C
#include <stdio.h>
#include <signal.h>
void signalhandler(int sig_num) {
signal(SIGTSTP, signalhandler); // ลงทะเบียน handler ใหม่
printf("Cannot execute Ctrl+Z\n");
}
int main() {
int a = 1;
signal(SIGTSTP, signalhandler); // ตั้งค่า handler สำหรับ SIGTSTP
while (a) {
// วนลูปไม่รู้จบ
}
return 0;
}ผลลัพธ์
// โปรแกรมจะทำงานเป็นลูปไม่รู้จบ // เมื่อกด Ctrl+Z จะพิมพ์ "Cannot execute Ctrl+Z" แทนที่จะหยุด
คำอธิบาย: ฟังก์ชัน signalhandler() จะถูกเรียกเมื่อมีสัญญาณ SIGTSTP เข้ามา มันจะลงทะเบียนตัวเองใหม่และพิมพ์ข้อความ แทนที่จะให้โปรแกรมหยุดทำงาน