mirror of
				https://github.com/linuxkit/linuxkit.git
				synced 2025-11-04 16:04:46 +00:00 
			
		
		
		
	'moby run' will use the kernel and initrd image produced by 'moby build' and, on macOS, will run it inside a hyperkit VM. This assumes that you have a recent version of Docker for Mac installed as it re-uses the hyperkit and VPNKit from it. Signed-off-by: Rolf Neugebauer <rolf.neugebauer@docker.com>
		
			
				
	
	
		
			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[:])
 | 
						|
}
 |