Bagaimana untuk Memeriksa Kewujudan Proses dengan Amanah dalam Go Beyond os.FindProcess?

Mary-Kate Olsen
Lepaskan: 2024-11-07 12:32:03
asal
903 orang telah melayarinya

How to Reliably Check for Process Existence in Go Beyond os.FindProcess?

Cara Mengesahkan Kewujudan Proses dalam Go Tanpa Bergantung Semata-mata pada os.FindProcess

Apabila berurusan dengan proses dalam Go, perkara biasa kecenderungan adalah untuk menggunakan os.FindProcess untuk menentukan sama ada proses dengan PID tertentu wujud. Walau bagaimanapun, hanya bergantung pada kaedah ini boleh membawa kepada kesimpulan yang tidak tepat.

Keterbatasan os.FindProcess

os.FindProcess dengan berkesan menanyakan sistem pengendalian untuk mendapatkan maklumat tentang sesuatu proses . Jika proses dengan PID yang ditentukan wujud, ia mengembalikan hasil bukan ralat. Walau bagaimanapun, jika proses telah ditamatkan, os.FindProcess masih boleh melaporkan kejayaan jika sistem pengendalian belum lagi menuai proses (iaitu, mengalih keluar masuknya daripada jadual proses sistem). Ini boleh membawa kepada positif palsu, menunjukkan bahawa proses masih berjalan apabila ia telah benar-benar selesai.

Meneroka Penyelesaian Alternatif: Menghantar Isyarat

Untuk menyemak dengan pasti kewujudan proses, kita boleh menggunakan pendekatan Unix tradisional untuk menghantar isyarat 0 (sifar) kepada proses sasaran. Teknik ini berfungsi kerana:

  • Jika proses masih hidup, menghantar isyarat 0 akan berjaya tanpa menyebabkan sebarang kesan buruk.
  • Jika proses telah ditamatkan, menghantar isyarat 0 akan gagal dengan mesej ralat "tiada proses sedemikian."

Melaksanakan Penyelesaian Berasaskan Isyarat dalam Go

Berikut ialah contoh fungsi Go yang menggunakan ini pendekatan:

package main

import (
    "fmt"
    "log"
    "os"
    "os/signal"
    "strconv"
)

// checkProcessExistence sends a signal of 0 to a process to determine its existence.
func checkProcessExistence(pid int) bool {
    process, err := os.FindProcess(pid)
    if err != nil {
        log.Fatal(err)
    }

    err = process.Signal(signal.Signal(0))
    if err != nil {
        return false
    }

    return true
}

func main() {
    for _, p := range os.Args[1:] {
        pid, err := strconv.ParseInt(p, 10, 64)
        if err != nil {
            log.Fatal(err)
        }

        if checkProcessExistence(int(pid)) {
            fmt.Printf("Process with PID %d is running\n", pid)
        } else {
            fmt.Printf("Process with PID %d is not running\n", pid)
        }
    }
}
Salin selepas log masuk

Contoh Penggunaan

Andaikan anda mempunyai PID proses A dan anda ingin mengesahkan sama ada ia masih berjalan:

$ go run main.go 12345
Process with PID 12345 is running
Salin selepas log masuk

Output ini mengesahkan bahawa proses 12345 sememangnya hidup.

Atas ialah kandungan terperinci Bagaimana untuk Memeriksa Kewujudan Proses dengan Amanah dalam Go Beyond os.FindProcess?. 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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!