Я использую интерфейс Ptrace пакета системных вызовов Go для трассировки процесса. Проблема в том, что если трассировка выполняется долго, трассировка зависает. Я попытался воспроизвести проблему с реализацией C, но там все работает нормально.
Вот код Go для воспроизведения проблемы:
import (
"fmt"
"os"
"os/exec"
"syscall"
)
func main() {
len := "9999999"
cmd := exec.Command("openssl", "rand", "-hex", len)
cmd.SysProcAttr = &syscall.SysProcAttr{Ptrace: true}
cmd.Stdout = os.Stdout
cmd.Stdin = os.Stdin
cmd.Start()
pid, _ := syscall.Wait4(-1, nil, syscall.WALL, nil)
for {
syscall.PtraceSyscall(pid, 0)
_, err := syscall.Wait4(-1, nil, syscall.WALL, nil)
if err != nil {
fmt.Println(err)
break
}
}
}
При запуске приведенного выше кода процесс никогда не завершается, и его необходимо прервать. Если изменить переменную len
на что-то меньшее, например 9
, процесс завершится без проблем, и вывод будет выглядеть следующим образом:
$ go run main.go
d2ff963e65e8e1926b
no child processes
syscall.Wait4
внутри циклаfor
- person NeverThoughtIWouldPostHere   schedule 22.06.2020