当前位置:网站首页>golang fork 进程的三种方式
golang fork 进程的三种方式
2022-08-11 05:56:00 【coloured_】
第一种方式:
func fork1() (*os.Process, error) {
// 获取当前进程名和工作目录
execName, err := os.Executable() // 输出与 os.Args[0] 类似
if err != nil {
return nil, err
}
// 生成子进程
p, err := os.StartProcess(execName, []string{
execName}, &os.ProcAttr{
Dir: filepath.Dir(execName), //工作路径 不包含文件名
Env: os.Environ(), // 获取当前环境变量 并且传入子进程
Files: []*os.File{
os.Stdin,
os.Stdout,
os.Stderr,
},
Sys: &syscall.SysProcAttr{
},
})
if err != nil {
return nil, err
}
return p, nil
}
// 参考文章
// https://studygolang.com/articles/14038
第一种方式用法:
cmd, err := fork1()
if err != nil {
fmt.Println(err)
return
}
log.Printf("fork1 pid=%v name=%v\n", cmd.Pid, filepath.Base(args[0]))
os.Exit(0) // fork 进程后退出
第二种方式:
func fork2() (*exec.Cmd, error) {
path, err := os.Executable() // 与 os.Args[0] 类似
if err != nil {
return nil, err
}
cmd := &exec.Cmd{
Path: path, //文件路径 包括文件名
Args: []string{
path}, //执行的命令
Dir: filepath.Dir(path), //文件路径 不包括文件名
Env: os.Environ(), //环境变量
Stdin: os.Stdin, // 输入
Stdout: os.Stdout, // 输出
Stderr: os.Stderr, // 错误
SysProcAttr: &syscall.SysProcAttr{
},
/* SysProcAttr: &syscall.SysProcAttr{ Pdeathsig: syscall.SIGTERM, },*/
}
err = cmd.Start() // 不阻塞地执行
if err != nil {
return nil, err
}
/* if err := cmd.Wait(); err != nil { // 阻塞 log.Panicf("failed to wait command: %s", err) }*/
return cmd, nil
}
// 参考文章
// https://blog.csdn.net/u013755520/article/details/106262434
第二种方式用法:
cmd, err := fork2()
if err != nil {
fmt.Println("error: ", err)
return
}
fmt.Println("fork2 pid = ", cmd.Process.Pid) //获取pid
os.Exit(0) // fork 进程后退出
第三种方式:
windows下不可用
var args = os.Args
func fork3() (error, int) {
procAttr := &syscall.ProcAttr{
Env: os.Environ(),
Files: []uintptr{
os.Stdin.Fd(), os.Stdout.Fd(), os.Stderr.Fd()},
}
// windows下不可用
pid, err := syscall.ForkExec(args[0], []string{
args[0]}, procAttr)
if err != nil {
return err, pid
}
return nil, pid
}
// 参考文章
// https://juejin.cn/post/6844903656891154446
第三种方式用法:
err, pid := fork3()
if err != nil {
fmt.Println("error", err)
return
}
log.Println("fork3 pid=", pid)
os,Exit(0) // fork 进程后退出
边栏推荐
- 【深度学习】什么是互信息最大化?
- Daily sql: request for friend application pass rate
- 已解决EROR 1064 (42000): You have an error in. your SOL syntax. check the manual that corresponds to yo
- 深度监督(中继监督)
- 你是如何做好Unity项目性能优化的
- Unity游戏排行榜的制作与优化
- OA project meeting notice (query & whether attending & feedback for details)
- 软件测试基本流程有哪些?北京专业第三方软件检测机构安利
- ROS 话题通信理论模型
- Resolved EROR 1064 (42000): You have an error in. your SOL syntax. check the manual that corresponds to yo
猜你喜欢
每日sql-统计各个专业人数(包括专业人数为0的)
Resolved EROR 1064 (42000): You have an error in. your SOL syntax. check the manual that corresponds to yo
拼多多api接口应用示例
快速了解集成学习
Top20 bracket matching
MySQL导入导出&视图&索引&执行计划
Amazon Get AMAZON Product Details API Return Value Description
OA project meeting notice (query & whether attending & feedback for details)
1688商品详情接口
opencv实现数据增强(图片+标签)平移,翻转,缩放,旋转
随机推荐
ROS 服务通信理论模型
一个小时快速熟悉MySQL基本用法
Taobao sku API interface (PHP example)
HCIA experiment
基于FPGA的FIR滤波器的实现(5)— 并行结构FIR滤波器的FPGA代码实现
下一代 无线局域网--强健性
技术分享 | 实战演练接口自动化如何处理 Form 请求?
My approval of OA project (inquiry & meeting signature)
图文带你理解什么是Few-shot Learning
实现通用的、高性能排序和快排优化
Spatial Pyramid Pooling -Spatial Pyramid Pooling (including source code)
HCIP OSPF dynamic routing protocol
concept noun
opencv实现数据增强(图片+标签)平移,翻转,缩放,旋转
Class definition, class inheritance, and the use of super
《Generative Adversarial Networks》
亚马逊API接口大全
导航定位中的坐标系
Open Set Domain Adaptation 开集领域适应
unable to extend table xxx by 1024 in tablespace xxxx