从 Go 调用程序时,我试图拦截系统调用,但是我遇到了两个问题。
孩子似乎挂起,这也挂起父进程。好像wait4(2)
阻塞了,好像很奇怪,孩子最后不会叫exit(2)
退出吗?
我得到的系统调用stdout
不一致,有时最后一个系统调用是3
,其他时候是6
or 192
。我的代码中有竞态条件吗?为什么会这样?
我尝试在父母身上收听信号,但我没有收到任何东西..
我已经替换了我通常运行的程序/bin/ls
。
package main
import (
"syscall"
"fmt"
"os/signal"
"os"
)
func main() {
c := make(chan os.Signal, 1)
signal.Notify(c, os.Interrupt, os.Kill)
go SignalListener(c)
attr := new(syscall.ProcAttr)
attr.Sys = new(syscall.SysProcAttr)
attr.Sys.Ptrace = true
pid, err := syscall.ForkExec("/bin/ls", nil, attr)
if err != nil {
panic(err)
}
var wstat syscall.WaitStatus
var regs syscall.PtraceRegs
for {
fmt.Println("Waiting..")
_, err := syscall.Wait4(pid, &wstat, 0, nil)
fmt.Printf("Exited: %d\n", wstat.Exited())
if err != nil {
fmt.Println(err)
break
}
syscall.PtraceGetRegs(pid, ®s);
fmt.Printf("syscall: %d\n", regs.Orig_eax)
syscall.PtraceSyscall(pid, 0)
}
}
func SignalListener(c <-chan os.Signal) {
s := <-c
fmt.Printf("Got signal %d\n", s)
}