Files
MyGoNavi/internal/nativewindow/parent_lifecycle_unix.go
Syngnat b80989cb7b 🐛 fix(nativewindow): 修复主进程退出后子窗口残留
- 启动独立窗口时传递并校验主进程 PID
- 按平台监控父进程并在其退出后关闭子窗口
- 补充 PID 解析、真实父进程退出和异常探测回归测试
2026-07-27 08:43:12 +08:00

47 lines
954 B
Go

//go:build darwin || linux
package nativewindow
import (
"errors"
"fmt"
"os"
"golang.org/x/sys/unix"
)
type unixDetachedParentWatcher struct {
pid int
}
func newDetachedParentWatcher(pid int) (detachedParentWatcher, error) {
if pid <= 1 {
return nil, fmt.Errorf("invalid detached parent process ID: %d", pid)
}
return &unixDetachedParentWatcher{pid: pid}, nil
}
func (w *unixDetachedParentWatcher) Alive() (bool, error) {
if w == nil || w.pid <= 1 {
return false, nil
}
// Unix reparents an orphan to launchd/init. Checking both PPID and signal 0
// prevents a recycled PID from keeping a detached window alive indefinitely.
if os.Getppid() != w.pid {
return false, nil
}
err := unix.Kill(w.pid, 0)
switch {
case err == nil, errors.Is(err, unix.EPERM):
return true, nil
case errors.Is(err, unix.ESRCH):
return false, nil
default:
return true, err
}
}
func (*unixDetachedParentWatcher) Close() error {
return nil
}