Bosh sahifa Wiki Signal Disposition

Signal Disposition

Signal Dispositionprocess ma’lum signalni olganda qanday amal bajarilishini belgilovchi holat. Har signal uchun disposition default action, ignore yoki user o‘rnatgan handlerdan biri bo‘ladi. Disposition process miqyosida umumiy, signal mask esa har threadga tegishli; shu farq multi-thread dastur dizaynida muhim.

Default action

Kernel har signal uchun standart xulq belgilaydi. U processni tugatish, core dump bilan tugatish, to‘xtatish, davom ettirish yoki signalni e’tiborsiz qoldirish bo‘lishi mumkin. Masalan, terminaldan kelgan interrupt odatda processni tugatadi, stop signali esa executionni pauza qiladi.

Default disposition “handler yo‘q” degan umumiy bitta amal emas. Dastur signal jadvalini platforma hujjatidan oladi. Signal raqamlari va ayrim tafsilotlar Unix variantlari orasida farqlanishi mumkin.

Ignore

SIG_IGN signalni e’tiborsiz qoldirishni bildiradi. Ignore qilingan standard signal odatda pendingga ham qo‘yilmaydi. Biroq SIGKILL va SIGSTOPni ignore qilib bo‘lmaydi. SIGCHLD uchun ignore yoki SA_NOCLDWAIT child zombie semantikasiga maxsus ta’sir ko‘rsatadi.

Termination signalini ko‘r-ko‘rona ignore qilish service managerning nazoratli shutdownini buzadi. Dastur tozalash kerak bo‘lsa handler o‘rnatib, event loopga stop so‘rovini uzatadi va belgilangan timeoutda tugaydi.

Custom handler

sigaction function pointer, handler mask va flaglarni atomik o‘rnatadi. SA_RESETHAND handler bir marta ishlagach dispositionni defaultga qaytaradi. SA_NODEFER ayni signalning nested delivery’siga ruxsat beradi. Bu flaglar reentrancy va stack xatarini oshiradi.

Handler o‘rnatish bilan signal safety muammosi hal bo‘lmaydi. Handler faqat async-signal-safe amallarni bajaradi yoki dedicated waiting thread modeli ishlatiladi. Disposition boshqa thread tomonidan almashtirilsa keyingi delivery yangi holatni ko‘radi.

Fork va exec

Child forkdan keyin parent dispositionlarini meros oladi. exec muvaffaqiyatli bo‘lganda custom handlerlar defaultga qaytariladi, ignore qilingan signallar esa odatda ignore holatini saqlaydi. Signal mask ham exec orqali saqlanishi mumkin.

Shell childni ishga tushirishdan oldin job-control signallarini o‘zgartirgan bo‘lsa yangi dastur startup’da kutilgan disposition va maskni tiklashi kerak. Aks holda terminal interruptiga javob bermaydigan process paydo bo‘ladi.

Race va tekshirish

Dispositionni o‘zgartirish bilan signal generation orasida race mavjud. Zarur signal avval masklanadi, handler o‘rnatiladi, keyin unblock qilinadi. Bu vaqtinchalik default action bilan process tugashining oldini oladi.

Test default, ignore va handler variantlarini, fork/exec merosini, concurrent update va queued signalni qamraydi. Crash handler o‘rnatilganda core dump siyosati va original signalni qayta ko‘tarish ham tekshiriladi.

Kutubxona bilan kelishuv

Process-wide dispositionni ikki mustaqil kutubxona o‘zgartirsa oxirgi o‘rnatgan handler oldingisini almashtiradi. Handler chaining nazoratsiz bajarilsa async-safety va return semantikasi buziladi. Kutubxona global signalni egallashini hujjatlashtiradi yoki caller bergan event-loop integratsiyasidan foydalanadi. Runtime profiling, garbage collector va application bir xil signalni ishlatishi mumkinligi sabab signal raqami konfiguratsiya qilinadi.

Core dump siyosati

Fatal signalning default dispositioni core dump yaratishi mumkin, lekin resource limit, dump pattern, filesystem permission va security policy faylning amalda yozilishini belgilaydi. Custom crash handler defaultni yo‘qotsa tashqi collector kerakli dumpni olmaydi. Minimal metadata yozilgach disposition defaultga qaytarilib signal qayta yuborilishi mumkin. Re-raised signal ayni threadga tegishi va exit status original sababni saqlashi tekshiriladi.

Bog‘liq tushunchalar

sigaction, default action, signal handler, signal mask, fork, exec