当前位置:网站首页>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 进程后退出
边栏推荐
猜你喜欢
mysql视图与索引
Concurrent programming in eight-part essay
Douyin get douyin share password url API return value description
第一个C函数:如何实现板级初始化?
什么是Inductive learning和Transductive learning
Taobao API interface reference
Open Set Domain Adaptation 开集领域适应
ROS 服务通信理论模型
exness:黄金1800关口遇阻,静待美国CPI出炉
Discourse 的关闭主题(Close Topic )和重新开放主题
随机推荐
HCIP WPN experiment
A used in the study of EEG ultra scanning analysis process
1688商品详情接口
Taobao API interface reference
抖音API接口大全
2022-08-09 第四小组 修身课 学习笔记(every day)
ROS 服务通信理论模型
每日sql-找到每个学校gpa最低的同学(开窗)
详解BLEU的原理和计算
Coordinate system in navigation and positioning
【推荐系统】:协同过滤和基于内容过滤概述
PIXHAWK飞控使用RTK
[损失函数]——均方差
每日sql--统计员工近三个月的总薪水(不包括最新一个月)
获取拼多多商品信息操作详情
亚马逊API接口大全
OA project meeting notice (query & whether attending & feedback for details)
Cobbleland 博览会 基础系列 1
TOP2 Add two numbers
Douyin get douyin share password url API return value description