diff --git a/unix/example_test.go b/unix/example_test.go new file mode 100644 index 00000000..3ddf90fe --- /dev/null +++ b/unix/example_test.go @@ -0,0 +1,16 @@ +// Copyright 2018 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 unix + +import ( + "log" + "os" + "syscall" +) + +func ExampleExec() { + err := syscall.Exec("/bin/ls", []string{"ls", "-al"}, os.Environ()) + log.Fatal(err) +} diff --git a/unix/syscall_unix.go b/unix/syscall_unix.go index 80b05a40..95ce5557 100644 --- a/unix/syscall_unix.go +++ b/unix/syscall_unix.go @@ -305,3 +305,12 @@ func SetNonblock(fd int, nonblocking bool) (err error) { _, err = fcntl(fd, F_SETFL, flag) return err } + +// Exec calls execve(2), which replaces the calling executable in the process +// tree. argv0 should be the full path to an executable ("/bin/ls") and the +// executable name should also be the first argument in argv (["ls", "-l"]). +// envv are the environment variables that should be passed to the new +// process (["USER=go", "PWD=/tmp"]). +func Exec(argv0 string, argv []string, envv []string) error { + return syscall.Exec(argv0, argv, envv) +}