pipe_bsd.go 796 B

1234567891011121314151617181920212223242526272829
  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.
  4. // +build darwin dragonfly freebsd nacl netbsd openbsd solaris
  5. package os
  6. import "syscall"
  7. // Pipe returns a connected pair of Files; reads from r return bytes written to w.
  8. // It returns the files and an error, if any.
  9. func Pipe() (r *File, w *File, err error) {
  10. var p [2]int
  11. // See ../syscall/exec.go for description of lock.
  12. syscall.ForkLock.RLock()
  13. e := syscall.Pipe(p[0:])
  14. if e != nil {
  15. syscall.ForkLock.RUnlock()
  16. return nil, nil, NewSyscallError("pipe", e)
  17. }
  18. syscall.CloseOnExec(p[0])
  19. syscall.CloseOnExec(p[1])
  20. syscall.ForkLock.RUnlock()
  21. return NewFile(uintptr(p[0]), "|0"), NewFile(uintptr(p[1]), "|1"), nil
  22. }