1 // Copyright 2009 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
14 // Wait waits for the Process to exit or stop, and then returns a
15 // Waitmsg describing its status and an error, if any.
16 func (p *Process) Wait(options int) (w *Waitmsg, err error) {
17 s, e := syscall.WaitForSingleObject(syscall.Handle(p.handle), syscall.INFINITE)
19 case syscall.WAIT_OBJECT_0:
21 case syscall.WAIT_FAILED:
22 return nil, NewSyscallError("WaitForSingleObject", e)
24 return nil, errors.New("os: unexpected result from WaitForSingleObject")
27 e = syscall.GetExitCodeProcess(syscall.Handle(p.handle), &ec)
29 return nil, NewSyscallError("GetExitCodeProcess", e)
32 return &Waitmsg{p.Pid, syscall.WaitStatus{s, ec}, new(syscall.Rusage)}, nil
35 // Signal sends a signal to the Process.
36 func (p *Process) Signal(sig Signal) error {
38 return errors.New("os: process already finished")
40 switch sig.(UnixSignal) {
42 e := syscall.TerminateProcess(syscall.Handle(p.handle), 1)
43 return NewSyscallError("TerminateProcess", e)
45 return syscall.Errno(syscall.EWINDOWS)
48 // Release releases any resources associated with the Process.
49 func (p *Process) Release() error {
53 e := syscall.CloseHandle(syscall.Handle(p.handle))
55 return NewSyscallError("CloseHandle", e)
58 // no need for a finalizer anymore
59 runtime.SetFinalizer(p, nil)
63 func findProcess(pid int) (p *Process, err error) {
64 const da = syscall.STANDARD_RIGHTS_READ |
65 syscall.PROCESS_QUERY_INFORMATION | syscall.SYNCHRONIZE
66 h, e := syscall.OpenProcess(da, false, uint32(pid))
68 return nil, NewSyscallError("OpenProcess", e)
70 return newProcess(pid, int(h)), nil
75 cmd := syscall.GetCommandLine()
76 argv, e := syscall.CommandLineToArgv(cmd, &argc)
80 defer syscall.LocalFree(syscall.Handle(uintptr(unsafe.Pointer(argv))))
81 Args = make([]string, argc)
82 for i, v := range (*argv)[:argc] {
83 Args[i] = string(syscall.UTF16ToString((*v)[:]))