golang dos tak keluar

王林
Lepaskan: 2023-05-15 12:37:40
asal
642 orang telah melayarinya

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:

  1. Panggil os.Exit untuk keluar dari program dan menamatkan proses terus;
  2. Panggil os.Process.Kill untuk mematikan proses
  3. Program keluar secara aktif selepas semua coroutine selesai.

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:

  1. Gunakan fungsi isyarat.Notify untuk mendaftarkan satu atau lebih penerima isyarat
  2. Apabila program berjalan Tunggu penerimaan isyarat dan proses isyarat yang diterima
  3. Selepas memproses isyarat, anda boleh melakukan os.Exit atau operasi pembersihan lain secara adaptif dalam program.

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)
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan