内容简介:Golang中没有提供
https://github.com/moby/moby/tree/master/pkg/reexec
Golang中没有提供 fork
调用,只有
这三个都类似于 fork + exec
,但是没有类似C中的fork调用,在fork之后根据返回的pid
然后进入不同的函数。原因在:
https://stackoverflow.com/questions/28370646/how-do-i-fork-a-go-process/28371586#28371586
简要翻译一下:
fork
先看一下C里的传统使用方式:
#include <sys/types.h> #include <unistd.h> #include <stdio.h> #include <sys/wait.h> void child() { printf("child process\n"); } int main() { printf("main process\n"); pid_t pid = fork(); int wstatus; if (pid == 0) { child(); } else { printf("main exit\n"); waitpid(pid, &wstatus, 0); } }
运行一下:
$ gcc main.c && ./a.out main process main exit child process
我们看看 Docker 提供的实现的使用方式:
package main import ( "log" "os" "github.com/docker/docker/pkg/reexec" ) func init() { log.Printf("init start, os.Args = %+v\n", os.Args) reexec.Register("childProcess", childProcess) if reexec.Init() { os.Exit(0) } } func childProcess() { log.Println("childProcess") } func main() { log.Printf("main start, os.Args = %+v\n", os.Args) cmd := reexec.Command("childProcess") cmd.Stdin = os.Stdin cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr if err := cmd.Start(); err != nil { log.Panicf("failed to run command: %s", err) } if err := cmd.Wait(); err != nil { log.Panicf("failed to wait command: %s", err) } log.Println("main exit") }
跑一下:
$ go run main.go 2018/03/08 19:52:39 init start, os.Args = [/tmp/go-build209640177/b001/exe/main] 2018/03/08 19:52:39 main start, os.Args = [/tmp/go-build209640177/b001/exe/main] 2018/03/08 19:52:39 init start, os.Args = [childProcess] 2018/03/08 19:52:39 childProcess 2018/03/08 19:52:39 main exit
其原理是 init
一定会在 main
之前执行。而初次执行程序的时候 os.Args[0]
是可执行文件的名字。
但是 reexec.Command
却可以修改子进程的 os.Args[0]
。所以子进程会直接找到 reexec.Init
上 reexec.Register
所注册的函数,然后执行,返回true。然后调用 os.Exit(0)
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- zookeeper典型应用场景解析
- 单例模式及典型应用
- Java XXE 漏洞典型场景浅析
- 利用jstack定位典型性能问题实例
- [译] Elasticsearch Top 5 典型应用场景
- 设计模式 | 享元模式及典型应用
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
1024·人与机器共同进化
东西文库 / 译言·东西文库/电子工业出版社 / 2013-12-20 / 55元
《1024》:国内第一本专注于科技文化的mook。 本期创刊号将目光定焦在“人与机器”这个超热点领域。 如果把机器获得思维能力看作是一种进化, 那人类具备不朽之躯同样也是一种进化。 这是一个野心勃勃但又充满不确定性的未来。 在我们一厢情愿地猜测机器将在不远的将来赶超自己而惶惶不可终日时,人类其实还有一个机会——变得更像机器。这并非科幻小说,而是正在发生的现实。人类创造......一起来看看 《1024·人与机器共同进化》 这本书的介绍吧!