| // 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 // handle is accessed atomically on Windows | |
| 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() } |