2012-03-27 23:13:14 +00:00
|
|
|
// Copyright 2009 The Go Authors. All rights reserved.
|
|
|
|
// Use of this source code is governed by a BSD-style
|
|
|
|
// license that can be found in the LICENSE file.
|
|
|
|
|
|
|
|
package os
|
|
|
|
|
|
|
|
import (
|
|
|
|
"runtime"
|
2014-09-21 17:33:12 +00:00
|
|
|
"sync/atomic"
|
2012-03-27 23:13:14 +00:00
|
|
|
"syscall"
|
|
|
|
)
|
|
|
|
|
|
|
|
// Process stores the information about a process created by StartProcess.
|
|
|
|
type Process struct {
|
|
|
|
Pid int
|
2017-04-10 11:32:00 +00:00
|
|
|
handle uintptr // handle is accessed atomically on Windows
|
|
|
|
isdone uint32 // process has been successfully waited on, non zero if true
|
2012-03-27 23:13:14 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func newProcess(pid int, handle uintptr) *Process {
|
|
|
|
p := &Process{Pid: pid, handle: handle}
|
|
|
|
runtime.SetFinalizer(p, (*Process).Release)
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
2014-09-21 17:33:12 +00:00
|
|
|
func (p *Process) setDone() {
|
|
|
|
atomic.StoreUint32(&p.isdone, 1)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (p *Process) done() bool {
|
|
|
|
return atomic.LoadUint32(&p.isdone) > 0
|
|
|
|
}
|
|
|
|
|
2012-03-27 23:13:14 +00:00
|
|
|
// ProcAttr holds the attributes that will be applied to a new process
|
|
|
|
// started by StartProcess.
|
|
|
|
type ProcAttr struct {
|
|
|
|
// If Dir is non-empty, the child changes into the directory before
|
|
|
|
// creating the process.
|
|
|
|
Dir string
|
|
|
|
// If Env is non-nil, it gives the environment variables for the
|
|
|
|
// new process in the form returned by Environ.
|
|
|
|
// If it is nil, the result of Environ will be used.
|
|
|
|
Env []string
|
|
|
|
// Files specifies the open files inherited by the new process. The
|
|
|
|
// first three entries correspond to standard input, standard output, and
|
|
|
|
// standard error. An implementation may support additional entries,
|
|
|
|
// depending on the underlying operating system. A nil entry corresponds
|
|
|
|
// to that file being closed when the process starts.
|
|
|
|
Files []*File
|
|
|
|
|
|
|
|
// Operating system-specific process creation attributes.
|
|
|
|
// Note that setting this field means that your program
|
|
|
|
// may not execute properly or even compile on some
|
|
|
|
// operating systems.
|
|
|
|
Sys *syscall.SysProcAttr
|
|
|
|
}
|
|
|
|
|
|
|
|
// A Signal represents an operating system signal.
|
|
|
|
// The usual underlying implementation is operating system-dependent:
|
|
|
|
// on Unix it is syscall.Signal.
|
|
|
|
type Signal interface {
|
|
|
|
String() string
|
|
|
|
Signal() // to distinguish from other Stringers
|
|
|
|
}
|
|
|
|
|
|
|
|
// Getpid returns the process id of the caller.
|
|
|
|
func Getpid() int { return syscall.Getpid() }
|
|
|
|
|
|
|
|
// Getppid returns the process id of the caller's parent.
|
|
|
|
func Getppid() int { return syscall.Getppid() }
|