1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
//go:build linux
package devsup
import (
"errors"
"fmt"
"golang.org/x/sys/unix"
)
func pin(pid int) (uint64, error) {
if pid <= 0 {
return 0, fmt.Errorf("%w: pid %d", errGone, pid)
}
fd, err := unix.PidfdOpen(pid, 0)
if errors.Is(err, unix.ESRCH) {
return 0, fmt.Errorf("%w: pidfd_open(%d): %v", errGone, pid, err)
}
if err != nil {
return 0, err
}
defer unix.Close(fd)
p, ok := readProcInfo(pid)
if !ok || p.state == 'Z' || p.state == 'X' {
return 0, fmt.Errorf("%w: pid %d", errGone, pid)
}
if err := unix.PidfdSendSignal(fd, 0, nil, 0); err != nil {
return 0, fmt.Errorf("%w: pidfd_send_signal(%d, 0): %v", errGone, pid, err)
}
return p.ticks, nil
}