golang使用execCommand调用的时候子进程如何杀掉处理方法

时间:2025-03-03 08:47:45

最近在写一个应用,下面是用到的代码,网上也有挺多的网友遇到这种问题,下面是我的解决方法,分享一下.

使用方法,想的时候使用SetPgid设置进程组,杀的时候使用KillAll杀死全部调用产生的进程


代码实现:

Linux处理方法:

package system

import (
	"syscall"
)

func SetPgid(pid, pgid int) error {
	return (pid, pgid)
}

func GetPPids(pid int) ([]int, error) {
	return []int{}, nil
}

func Kill(pids []uint32) {
	for _, pid := range pids {
		(int(pid), )
	}
}

func KillAll(pid int) error {
	return (pid-(pid*2), )
}

Windows处理方法:

package system

import (
	"os"
	"syscall"
	"unsafe"
)

const (
	MAX_PATH           = 260
	TH32CS_SNAPPROCESS = 0x00000002
)

type ProcessInfo struct {
	Name string
	Pid  uint32
	PPid uint32
}

type PROCESSENTRY32 struct {
	DwSize              uint32
	CntUsage            uint32
	Th32ProcessID       uint32
	Th32DefaultHeapID   uintptr
	Th32ModuleID        uint32
	CntThreads          uint32
	Th32ParentProcessID uint32
	PcPriClassBase      int32
	DwFlags             uint32
	SzExeFile           [MAX_PATH]uint16
}

type HANDLE uintptr

var (
	modkernel32                  = ("")
	procCreateToolhelp32Snapshot = ("CreateToolhelp32Snapshot")
	procProcess32First           = ("Process32FirstW")
	procProcess32Next            = ("Process32NextW")
	procCloseHandle              = ("CloseHandle")
)

func SetPgid(pid, pgid int) error {
	return nil
}

func KillAll(pid int) error {
	pids := Getppids(uint32(pid))
	Kill(pids)
	return nil
}

func Kill(pids []uint32) {
	for _, pid := range pids {
		pro, err := (int(pid))
		if err != nil {
			continue
		}
		()
	}
}

func Getppids(pid uint32) []uint32 {
	infos, err := GetProcs()
	if err != nil {
		return []uint32{pid}
	}
	var pids []uint32 = make([]uint32, 0, len(infos))
	var index int = 0
	pids = append(pids, pid)

	var length int = len(pids)
	for index < length {
		for _, info := range infos {
			if  == pids[index] {
				pids = append(pids, )
			}
		}
		index += 1
		length = len(pids)
	}
	return pids
}

func GetProcs() (procs []ProcessInfo, err error) {
	snap := createToolhelp32Snapshot(TH32CS_SNAPPROCESS, uint32(0))
	if snap == 0 {
		err = ()
		return
	}

	defer closeHandle(snap)

	var pe32 PROCESSENTRY32

	 = uint32((pe32))
	if process32First(snap, &pe32) == false {
		err = ()
		return
	}
	procs = append(procs, ProcessInfo{syscall.UTF16ToString([:260]), pe32.Th32ProcessID, pe32.Th32ParentProcessID})
	for process32Next(snap, &pe32) {
		procs = append(procs, ProcessInfo{syscall.UTF16ToString([:260]), pe32.Th32ProcessID, pe32.Th32ParentProcessID})
	}
	return
}

func createToolhelp32Snapshot(flags, processId uint32) HANDLE {
	ret, _, _ := (
		uintptr(flags),
		uintptr(processId))

	if ret <= 0 {
		return HANDLE(0)
	}
	return HANDLE(ret)
}

func process32First(snapshot HANDLE, pe *PROCESSENTRY32) bool {
	ret, _, _ := (
		uintptr(snapshot),
		uintptr((pe)))

	return ret != 0
}

func process32Next(snapshot HANDLE, pe *PROCESSENTRY32) bool {
	ret, _, _ := (
		uintptr(snapshot),
		uintptr((pe)))

	return ret != 0
}

func closeHandle(object HANDLE) bool {
	ret, _, _ := (
		uintptr(object))
	return ret != 0
}