هل يمكن اعتراض إشارة Ctrl+C (SIGINT) وتنفيذ دالة تنظيف مثل defer؟
مرحباً بالجميع! أنا أكتب خادم HTTP صغير بلغة Go يعالج الطلبات ويحفظ البيانات في ملف. عندما أشغل الخادم وأضغط Ctrl+C، ينتهي البرنامج فوراً ويبقى الملف في حالة غير مكتملة. أريد أنه عند استقبال SIGINT (Ctrl+C) يتم أولاً تنفيذ دالة تنظيف (مثل flush البيانات على القرص وإغلاق الملفات)، وبعدها فقط ينتهي البرنامج.
أعرف عن `defer` — يعمل بشكل ممتاز عندما تنتهي الدالة بشكل طبيعي أو عبر `return`. لكن إذا ضغطت Ctrl+C، لا يعمل `defer` لأن البرنامج يُقتل ببساطة بواسطة الإشارة.
هل يمكن اعتراض هذه الإشارة وتنفيذ منطق cleanup بأسلوب `defer`؟ حتى لا أكتب حلولاً مؤقتة بفحص يدوي للـ flags. إليك مثال على الكود الخاص بي:
```go
package main
import (
"fmt"
"log"
"net/http"
"os"
"os/signal"
"syscall"
)
func main() {
// نفتح ملف للسجلات
f, _ := os.Create("server.log")
defer f.Close()
http