Foundationপ্রথম নীতি থেকে
LEVEL 4 · Operating Systems

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
2SIGINTTerm
9SIGKILLTerm — কখনো catch/block হয় না
11SIGSEGVCore
15SIGTERMTerm — kill কমান্ডের ডিফল্ট
17SIGCHLDIgn
19SIGSTOPStop — 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