97 lines
2.8 KiB
Go
97 lines
2.8 KiB
Go
|
// +build solaris
|
||
|
|
||
|
package ps
|
||
|
|
||
|
import (
|
||
|
"encoding/binary"
|
||
|
"fmt"
|
||
|
"os"
|
||
|
)
|
||
|
|
||
|
type ushort_t uint16
|
||
|
|
||
|
type id_t int32
|
||
|
type pid_t int32
|
||
|
type uid_t int32
|
||
|
type gid_t int32
|
||
|
|
||
|
type dev_t uint64
|
||
|
type size_t uint64
|
||
|
type uintptr_t uint64
|
||
|
|
||
|
type timestruc_t [16]byte
|
||
|
|
||
|
// This is copy from /usr/include/sys/procfs.h
|
||
|
type psinfo_t struct {
|
||
|
Pr_flag int32 /* process flags (DEPRECATED; do not use) */
|
||
|
Pr_nlwp int32 /* number of active lwps in the process */
|
||
|
Pr_pid pid_t /* unique process id */
|
||
|
Pr_ppid pid_t /* process id of parent */
|
||
|
Pr_pgid pid_t /* pid of process group leader */
|
||
|
Pr_sid pid_t /* session id */
|
||
|
Pr_uid uid_t /* real user id */
|
||
|
Pr_euid uid_t /* effective user id */
|
||
|
Pr_gid gid_t /* real group id */
|
||
|
Pr_egid gid_t /* effective group id */
|
||
|
Pr_addr uintptr_t /* address of process */
|
||
|
Pr_size size_t /* size of process image in Kbytes */
|
||
|
Pr_rssize size_t /* resident set size in Kbytes */
|
||
|
Pr_pad1 size_t
|
||
|
Pr_ttydev dev_t /* controlling tty device (or PRNODEV) */
|
||
|
|
||
|
// Guess this following 2 ushort_t values require a padding to properly
|
||
|
// align to the 64bit mark.
|
||
|
Pr_pctcpu ushort_t /* % of recent cpu time used by all lwps */
|
||
|
Pr_pctmem ushort_t /* % of system memory used by process */
|
||
|
Pr_pad64bit [4]byte
|
||
|
|
||
|
Pr_start timestruc_t /* process start time, from the epoch */
|
||
|
Pr_time timestruc_t /* usr+sys cpu time for this process */
|
||
|
Pr_ctime timestruc_t /* usr+sys cpu time for reaped children */
|
||
|
Pr_fname [16]byte /* name of execed file */
|
||
|
Pr_psargs [80]byte /* initial characters of arg list */
|
||
|
Pr_wstat int32 /* if zombie, the wait() status */
|
||
|
Pr_argc int32 /* initial argument count */
|
||
|
Pr_argv uintptr_t /* address of initial argument vector */
|
||
|
Pr_envp uintptr_t /* address of initial environment vector */
|
||
|
Pr_dmodel [1]byte /* data model of the process */
|
||
|
Pr_pad2 [3]byte
|
||
|
Pr_taskid id_t /* task id */
|
||
|
Pr_projid id_t /* project id */
|
||
|
Pr_nzomb int32 /* number of zombie lwps in the process */
|
||
|
Pr_poolid id_t /* pool id */
|
||
|
Pr_zoneid id_t /* zone id */
|
||
|
Pr_contract id_t /* process contract */
|
||
|
Pr_filler int32 /* reserved for future use */
|
||
|
Pr_lwp [128]byte /* information for representative lwp */
|
||
|
}
|
||
|
|
||
|
func (p *UnixProcess) Refresh() error {
|
||
|
var psinfo psinfo_t
|
||
|
|
||
|
path := fmt.Sprintf("/proc/%d/psinfo", p.pid)
|
||
|
fh, err := os.Open(path)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
defer fh.Close()
|
||
|
|
||
|
err = binary.Read(fh, binary.LittleEndian, &psinfo)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
p.ppid = int(psinfo.Pr_ppid)
|
||
|
p.binary = toString(psinfo.Pr_fname[:], 16)
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func toString(array []byte, len int) string {
|
||
|
for i := 0; i < len; i++ {
|
||
|
if array[i] == 0 {
|
||
|
return string(array[:i])
|
||
|
}
|
||
|
}
|
||
|
return string(array[:])
|
||
|
}
|