--- src/syscall/syscall_freebsd.go.orig	2017-03-17 19:00:39.000000000 +0000
+++ src/syscall/syscall_freebsd.go	2017-03-17 19:00:39.000000000 +0000
@@ -82,13 +82,16 @@
 	return origlen - len(buf), count, names
 }
 
-//sysnb pipe() (r int, w int, err error)
+//sysnb pipe2(p *[2]_C_int, flags int) (err error)
 
-func Pipe(p []int) (err error) {
+func Pipe2(p []int, flags int) (err error) {
 	if len(p) != 2 {
 		return EINVAL
 	}
-	p[0], p[1], err = pipe()
+	var pp [2]_C_int
+	err = pipe2(&pp, flags)
+	p[0] = int(pp[0])
+	p[1] = int(pp[1])
 	return
 }
 
--- src/syscall/exec_bsd.go.orig	2017-03-17 18:21:43.000000000 +0000
+++ src/syscall/exec_bsd.go	2017-03-17 18:21:43.000000000 +0000
@@ -233,15 +233,7 @@
 }
 
 // Try to open a pipe with O_CLOEXEC set on both file descriptors.
-func forkExecPipe(p []int) error {
-	err := Pipe(p)
-	if err != nil {
-		return err
-	}
-	_, err = fcntl(p[0], F_SETFD, FD_CLOEXEC)
-	if err != nil {
-		return err
-	}
-	_, err = fcntl(p[1], F_SETFD, FD_CLOEXEC)
-	return err
+func forkExecPipe(p []int) (err error) {
+	err = Pipe2(p, O_CLOEXEC)
+	return
 }
--- src/syscall/zsyscall_freebsd_amd64.go.orig	2017-03-17 19:01:09.000000000 +0000
+++ src/syscall/zsyscall_freebsd_amd64.go	2017-03-17 19:01:09.000000000 +0000
@@ -260,10 +260,8 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func pipe() (r int, w int, err error) {
-	r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0)
-	r = int(r0)
-	w = int(r1)
+func pipe2(p *[2]_C_int, flags int) (err error) {
+	_, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0)
 	if e1 != 0 {
 		err = e1
 	}
--- src/syscall/zsyscall_freebsd_arm.go.orig	2017-03-17 20:52:22.000000000 +0000
+++ src/syscall/zsyscall_freebsd_arm.go	2017-03-17 20:52:22.000000000 +0000
@@ -260,10 +260,8 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func pipe() (r int, w int, err error) {
-	r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0)
-	r = int(r0)
-	w = int(r1)
+func pipe2(p *[2]_C_int, flags int) (err error) {
+	_, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0)
 	if e1 != 0 {
 		err = e1
 	}
--- src/syscall/zsyscall_freebsd_386.go.orig	2017-03-17 20:53:05.000000000 +0000
+++ src/syscall/zsyscall_freebsd_386.go	2017-03-17 20:53:05.000000000 +0000
@@ -260,10 +260,8 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func pipe() (r int, w int, err error) {
-	r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0)
-	r = int(r0)
-	w = int(r1)
+func pipe2(p *[2]_C_int, flags int) (err error) {
+	_, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0)
 	if e1 != 0 {
 		err = e1
 	}
--- src/os/pipe_bsd.go.orig	2017-03-17 20:54:41.000000000 +0000
+++ src/os/pipe_bsd.go	2017-03-17 20:54:41.000000000 +0000
@@ -13,16 +13,10 @@
 func Pipe() (r *File, w *File, err error) {
 	var p [2]int
 
-	// See ../syscall/exec.go for description of lock.
-	syscall.ForkLock.RLock()
-	e := syscall.Pipe(p[0:])
+	e := syscall.Pipe2(p[0:], syscall.O_CLOEXEC)
 	if e != nil {
-		syscall.ForkLock.RUnlock()
 		return nil, nil, NewSyscallError("pipe", e)
 	}
-	syscall.CloseOnExec(p[0])
-	syscall.CloseOnExec(p[1])
-	syscall.ForkLock.RUnlock()
 
 	return NewFile(uintptr(p[0]), "|0"), NewFile(uintptr(p[1]), "|1"), nil
 }
