كيفية اعتراض 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 لا يعمل عند إشارات نظام التشغيل
أنت