| // 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" | 
 | 	"sync/atomic" | 
 | 	"syscall" | 
 | ) | 
 |  | 
 | // Process stores the information about a process created by StartProcess. | 
 | type Process struct { | 
 | 	Pid    int | 
 | 	handle uintptr | 
 | 	isdone uint32 // process has been successfully waited on, non zero if true | 
 | } | 
 |  | 
 | func newProcess(pid int, handle uintptr) *Process { | 
 | 	p := &Process{Pid: pid, handle: handle} | 
 | 	runtime.SetFinalizer(p, (*Process).Release) | 
 | 	return p | 
 | } | 
 |  | 
 | func (p *Process) setDone() { | 
 | 	atomic.StoreUint32(&p.isdone, 1) | 
 | } | 
 |  | 
 | func (p *Process) done() bool { | 
 | 	return atomic.LoadUint32(&p.isdone) > 0 | 
 | } | 
 |  | 
 | // 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() } |