Signal
সিগন্যাল
kernel থেকে process-কে asynchronous ভাবে পাঠানো একটা সংখ্যা-চিহ্নিত বার্তা — normal control flow থামিয়ে একটা handler চালায়, তারপর সাধারণত আগের জায়গায় ফেরে। SIGKILL(9)/SIGSTOP(19) কখনো catch/block/ignore করা যায় না।
also: signal, SIGKILL, SIGTERM, SIGINT, SIGSEGV, software interrupt
Kernel-এর দৃষ্টিতে signal একটা সংখ্যা (1-64) — প্রতিটা process দুইটা ৬৪-বিট bitmask রাখে: pending (কোনগুলো এসেছে) আর blocked (কোনগুলো আটকানো)।
| সংখ্যা | নাম | ডিফল্ট action |
|---|---|---|
| 2 | SIGINT | Term |
| 9 | SIGKILL | Term — কখনো catch/block হয় না |
| 11 | SIGSEGV | Core |
| 15 | SIGTERM | Term — kill কমান্ডের ডিফল্ট |
| 17 | SIGCHLD | Ign |
| 19 | SIGSTOP | Stop — SIGKILL-এর মতোই un-catchable |
standard signal “গোনে” না — pending একটা bit মাত্র, counter না।
একই signal পাঁচবার এলেও bit একবারই সেট হয়, handler একবারই চলে।
এই কারণে SIGCHLD handler সবসময় waitpid(-1, &status, WNOHANG)
loop-এ চালাতে হয়, একবার wait() না।
static volatile sig_atomic_t flag = 0;
static void h(int sig) { flag = 1; } /* handler-এ এটুকুই নিরাপদ */
handler-এর ভেতর malloc()/printf() ডাকা বিপজ্জনক — এরা নিজেরাই
internal lock ব্যবহার করে, যা signal আসার আগে থেকেই আধা-লকড থাকতে
পারে (main flow তখন মাঝপথে) — classic self-deadlock। এই ছোট,
POSIX-নির্ধারিত নিরাপদ function-সেটকেই বলে async-signal-safe।