Apabila saya menggunakan Golang untuk menulis program untuk platform Windows baru-baru ini, saya menghadapi masalah pelik: selepas memulakan program, saya tidak boleh keluar dari program seperti biasa melalui "Ctrl+C" atau menutup konsol. Selepas program keluar, anda masih boleh melihat proses yang sedang dijalankan dalam pengurus tugas, mengakibatkan sumber yang tidak dapat dikeluarkan dan menjejaskan prestasi sistem dengan serius. Selepas menyemak banyak maklumat, saya akhirnya menemui sebab mengapa program tidak boleh keluar secara normal dan menemui penyelesaiannya.
Punca masalah
Di Golang, terdapat tiga cara utama untuk keluar dari program:
Walau bagaimanapun, di bawah platform Windows, apabila menggunakan kaedah os.Exit atau os.Process.Kill untuk keluar dari program, konsol DOS tidak akan keluar seperti biasa. Ini kerana pada platform Windows, konsol DOS mencipta kumpulan proses baharu apabila memulakan program, dan proses sebenar program dan proses konsol DOS tidak berada dalam kumpulan proses yang sama.
Apabila menggunakan kaedah os.Exit atau os.Process.Kill untuk keluar daripada atur cara, proses program sebenar dan proses konsol DOS masing-masing keluar daripada kumpulan proses yang berbeza, menyebabkan konsol gagal untuk keluar seperti biasa.
Penyelesaian
Semasa mencari penyelesaian, saya menemui perpustakaan standard Golang dengan nama pakej "os/signal", yang menyediakan fungsi menerima isyarat sistem dan memprosesnya dengan sewajarnya. Jadi kita boleh merealisasikan keluar biasa program dengan menangkap isyarat sistem pengendalian.
Langkah-langkah untuk menggunakan perpustakaan "os/signal" adalah seperti berikut:
Kod sampel adalah seperti berikut:
package main import ( "fmt" "os" "os/signal" "syscall" ) func main() { fmt.Println("start program") sigs := make(chan os.Signal, 1) done := make(chan bool, 1) signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM) go func() { sig := <-sigs fmt.Println() fmt.Println(sig) done <- true }() fmt.Println("waiting for signal") <-done fmt.Println("end program") os.Exit(0) }
Dalam kod di atas, kita mula-mula menggunakan isyarat.Fungsi Makluman untuk mendaftarkan isyarat gangguan sistem SIGINT dan isyarat berhenti program SIGTERM ke dalam penerima isyarat. Kemudian apabila program sedang berjalan, ia menunggu untuk penerimaan isyarat Apabila isyarat diterima, jenis isyarat dikeluarkan, dan status isyarat yang diterima dihantar ke program utama melalui saluran paip, dan diproses oleh saluran paip. program utama. Akhir sekali, selepas atur cara utama mengendalikan isyarat, keluar dari program seperti biasa melalui os.Exit(0).
Ringkasan
Secara keseluruhannya, Golang ialah bahasa pengaturcaraan yang cekap, ringkas dan selamat yang menyediakan antara muka perpustakaan yang ringkas dan berkuasa semasa memproses isyarat sistem. Di bawah platform Windows, menggunakan perpustakaan "os/signal" boleh menyelesaikan masalah program yang tidak dapat keluar secara normal dengan berkesan. Walau bagaimanapun, perlu diingatkan bahawa takrif isyarat mungkin berbeza di bawah persekitaran sistem pengendalian yang berbeza, dan pelarasan yang sepadan perlu dibuat untuk sistem pengendalian yang berbeza. Pada masa yang sama, apabila menggunakan program pemprosesan isyarat, anda juga perlu memberi perhatian kepada pembersihan dan pelepasan sumber global untuk mengelakkan kebocoran sumber dan kemerosotan prestasi sistem.
Atas ialah kandungan terperinci golang dos tak keluar. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!