Rumah > Artikel > pembangunan bahagian belakang > Bagaimana untuk membangunkan proses daemon dalam bahasa Go?
Bahasa Go ialah bahasa pengaturcaraan yang pantas dan cekap Ia mempunyai ciri yang baik dalam pembangunan proses daemon, seperti sokongan serentak terbina dalam, benang ringan, mekanisme pengumpulan sampah, dsb. Daemon ialah program yang boleh dilaksanakan di latar belakang Ia biasanya perlu dijalankan untuk masa yang lama, sentiasa mendengar acara luaran, seperti permintaan sambungan rangkaian, dan memproses peristiwa yang berlaku dengan sewajarnya. Artikel ini akan memperkenalkan cara membangunkan proses daemon dalam bahasa Go.
1. Keperluan asas proses daemon
Dalam sistem pengendalian Linux dan Unix, proses daemon perlu memenuhi beberapa keperluan asas:
2 Langkah untuk melaksanakan proses daemon
Membangunkan proses daemon dalam bahasa Go memerlukan melengkapkan langkah berikut:
Coretan kod untuk mencipta proses anak dan keluar dari proses induk dalam bahasa Go adalah seperti berikut :
func startDaemon() { cmd := exec.Command(os.Args[0]) cmd.Start() os.Exit(0) }
Kod ini akan memulakan proses baharu dan keluar daripada proses semasa, menjadikan proses baharu sebagai proses anak daemon.
Coretan kod untuk mencipta kumpulan perbualan baharu dalam bahasa Go adalah seperti berikut:
func startDaemon() { syscall.Umask(0) if syscall.Getppid() == 1 { return } cmd := exec.Command(os.Args[0]) cmd.Start() os.Exit(0) ... sysret, syserr := syscall.Setsid() if syserr != nil || sysret < 0 { fmt.Fprintf(os.Stderr, "Error: syscall.Setsid errno:%d %v ", syserr, syserr) os.Exit(1) } }
Kod ini mula-mula ditetapkan up the file Topeng kebenaran ialah 0, dan kemudian semak sama ada proses semasa sudah menjadi proses peneraju kumpulan sesi (iaitu, sama ada proses induk ialah proses init). Jika ya, tidak perlu membuat kumpulan perbualan baharu. Jika tidak, panggil fungsi setsid() yang dinyatakan di atas untuk mencipta kumpulan sesi baharu dan menjadikan proses semasa sebagai ketua kumpulan sesi.
Dalam bahasa Go, serpihan kod untuk menutup deskriptor fail adalah seperti berikut:
func startDaemon() { syscall.Umask(0) if syscall.Getppid() == 1 { return } cmd := exec.Command(os.Args[0]) cmd.Start() os.Exit(0) ... syscall.Close(0) // close stdin syscall.Close(1) // close stdout syscall.Close(2) // close stderr }
Kod ini menggunakan syscall pakej Fungsi Close() menutup deskriptor fail 0, 1, dan 2.
Coretan kod untuk mencipta direktori boleh tulis dalam bahasa Go adalah seperti berikut:
func startDaemon() { syscall.Umask(0) if syscall.Getppid() == 1 { return } cmd := exec.Command(os.Args[0]) cmd.Start() os.Exit(0) ... os.Chdir("/") dir, _ := ioutil.TempDir("", "") fd, _ := os.Open(dir) syscall.Dup2(int(fd.Fd()), 0) syscall.Dup2(int(fd.Fd()), 1) syscall.Dup2(int(fd.Fd()), 2) }
Kod ini mula-mula mengalih keluar proses Tukar direktori kerja semasa kepada direktori akar (/), dan kemudian gunakan fungsi TempDir() dalam pakej ioutil untuk mencipta direktori baharu di bawah direktori /tmp. Seterusnya, gunakan fungsi os.Open() untuk membuka direktori dan gunakan fungsi Dup2() dalam pakej syscall untuk menyalin deskriptor failnya ke deskriptor fail untuk input standard, output standard dan ralat standard.
Coretan kod untuk memuatkan sumber yang diperlukan boleh ditulis dalam fungsi kemasukan program.
Memproses isyarat SIGTERM dan SIGINTfunc main() { ... c := make(chan os.Signal, 1) signal.Notify(c, os.Interrupt, syscall.SIGTERM) go func() { <-c // 执行清理操作 os.Exit(0) }() ... }
Kod ini menggunakan os pakej Fungsi Signal() memindahkan isyarat SIGTERM dan SIGINT ke saluran paip untuk diproses. Kemudian, dengan mendengar paip ini dalam goroutine lain, anda boleh melakukan operasi pembersihan apabila isyarat ini diterima.
Atas ialah kandungan terperinci Bagaimana untuk membangunkan proses daemon dalam bahasa Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!