Go からプログラムを呼び出すときにシステムコールをインターセプトしようとしていますが、2 つの問題が発生しています。
子がハングしているように見え、親プロセスもハングします。奇妙に思えるwait4(2)
ブロッキングのようです。子供は最終的exit(2)
に終了するように呼び出しませんか?
私が取得したシステムコールstdout
は一貫していません。最後のシステムコールが である場合もあれば、3
または6
である場合もあります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)
}