Avatar ·

كيفية اعتراض Ctrl+C (SIGINT) وتنظيف الموارد في Go، مثل defer؟

مرحباً بالجميع! أنا أكتب تطبيق خادم بلغة Go يفتح اتصالات TCP، ويعمل مع الملفات وقاعدة البيانات. أحتاج أنه عند الضغط على Ctrl+C (إشارة SIGINT)، ينهي البرنامج عمله بشكل صحيح: يغلق الاتصالات، يحفظ البيانات، ويحرر الموارد. أعرف عن `defer` — إنه يعمل بشكل ممتاز عند الإنهاء الطبيعي للدالة. لكن عندما أضغط Ctrl+C، يُقتل البرنامج ببساطة، ولا يعمل `defer`. على سبيل المثال: ```go func main() { db, _ := sql.Open("postgres", "...") defer db.Close() // حلقة لا نهائية for { // نعمل } } ``` عند الضغط على Ctrl+C، لا يتم تنفيذ `defer db.Close()`. قرأت عن حزمة `os/signal`، لكنني لا أفهم كيفية تنظيم سلوك "شبيه بـ defer" بشكل صحيح. كيف أجعل دالة التنظيف تُنفذ بشكل مضمون عند أي إنهاء (طبيعي أو بإشارة)؟ أحتاج مثالاً على graceful shutdown. <<>>

المشكلة: defer لا يعمل عند إشارات نظام التشغيل

أنت