package os
import (
)
var (
Interrupt Signal = syscall.SIGINT
Kill Signal = syscall.SIGKILL
)
func ( string, []string, *ProcAttr) ( *Process, error) {
if != nil && .Sys == nil && .Dir != "" {
if , := Stat(.Dir); != nil {
:= .(*PathError)
.Op = "chdir"
return nil,
}
}
:= &syscall.ProcAttr{
Dir: .Dir,
Env: .Env,
Sys: .Sys,
}
if .Env == nil {
.Env, = execenv.Default(.Sys)
if != nil {
return nil,
}
}
.Files = make([]uintptr, 0, len(.Files))
for , := range .Files {
.Files = append(.Files, .Fd())
}
, , := syscall.StartProcess(, , )
runtime.KeepAlive()
if != nil {
return nil, &PathError{Op: "fork/exec", Path: , Err: }
}
return newProcess(, ), nil
}
func ( *Process) () error {
return .Signal(Kill)
}
type ProcessState struct {
pid int
status syscall.WaitStatus
rusage *syscall.Rusage
}
func ( *ProcessState) () int {
return .pid
}
func ( *ProcessState) () bool {
return .status.Exited()
}
func ( *ProcessState) () bool {
return .status.ExitStatus() == 0
}
func ( *ProcessState) () interface{} {
return .status
}
func ( *ProcessState) () interface{} {
return .rusage
}
func ( *ProcessState) () string {
if == nil {
return "<nil>"
}
:= .Sys().(syscall.WaitStatus)
:= ""
switch {
case .Exited():
= "exit status " + itoa(.ExitStatus())
case .Signaled():
= "signal: " + .Signal().String()
case .Stopped():
= "stop signal: " + .StopSignal().String()
if .StopSignal() == syscall.SIGTRAP && .TrapCause() != 0 {
+= " (trap " + itoa(.TrapCause()) + ")"
}
case .Continued():
= "continued"
}
if .CoreDump() {
+= " (core dumped)"
}
return
}
func ( *ProcessState) () int {
if == nil {
return -1
}
return .status.ExitStatus()
}