Executing Processes
#
// No exemplo anterior foi apresentada uma forma de
// [invocar processos externos](spawning-processes).
// Isto é feito quando é necessário um processo externo
// acessível a um programa Go sendo executado.
// Algumas vezes, no entanto, é necessário substituir
// completamente o processo Go corrente, por um outro
// (talvez até não-Go). Para fazer isto, será utilizada
// a implementação da clássica função
// <a href="https://en.wikipedia.org/wiki/Exec_(operating_system)"><code>exec</code></a>.
package main
import (
"os"
"os/exec"
"syscall"
)
func main() {
// Para este exemplo, será executado `ls`. Go requer um
// caminho absoluto para o binário que se pretende executar,
// então será usado `exec.LookPath` para localizar (provavelmente será
// `/bin/ls`).
binary, lookErr := exec.LookPath("ls")
if lookErr != nil {
panic(lookErr)
}
// `Exec` requer argumentos no formato de slice (e
// não na forma de string). Será passado ao `ls`
// alguns argumentos comuns. Note que o primeiro
// argumento deve ser o nome do programa.
args := []string{"ls", "-a", "-l", "-h"}
// `Exec` também necessita um conjunto de [variáveis de ambiente](environment-variables)
// para usar. Aqui é fornecido o ambiente atual
// por completo.
env := os.Environ()
// Aqui está a chamada à `syscall.Exec`. Se esta
// chamada for bem sucedida, a execução do processo
// terminará e será substituído pelo processo
// `/bin/ls -a -l -h`. Se houver algum erro, será
// retornado um valor.
execErr := syscall.Exec(binary, args, env)
if execErr != nil {
panic(execErr)
}
}
# Ao rodar o programa, ele é substituído pelo `ls`.
$ go run execing-processes.go
total 16
drwxr-xr-x 4 mark 136B Oct 3 16:29 .
drwxr-xr-x 91 mark 3.0K Oct 3 12:50 ..
-rw-r--r-- 1 mark 1.3K Oct 3 16:28 execing-processes.go
# Note que Go não oferece a função `fork`,
# clássica do Unix. Usualmente isto não é um
# problema, porque goroutines, invocação e
# executação de processos cobrem a maioria dos
# casos de uso de `fork`.