当前位置:网站首页>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 进程后退出
边栏推荐
猜你喜欢
Coordinate system in navigation and positioning
姿态解算-陀螺仪+欧拉法
【推荐系统】:协同过滤和基于内容过滤概述
HCIP BGP neighbor building, federation, and aggregation experiments
Edge 提供了标签分组功能
My meeting of the OA project (meeting seating & review)
技能在赛题解析:交换机防环路设置
损失函数——负对数似然
Taobao API interface reference
Multiscale communication in cortical-cortical networks
随机推荐
亚马逊获得AMAZON商品详情 API 返回值说明
MySQL之CRUD
ROS 话题通信理论模型
JD.com product details API call example explanation
1688 product interface
torch.cat()使用方法
Open Set Domain Adaptation 开集领域适应
空间金字塔池化 -Spatial Pyramid Pooling(含源码)
【深度学习】什么是互信息最大化?
Attitude solution - gyroscope + Euler method
Pinduoduo API interface (attach my available API)
ROS 服务通信理论模型
从 dpdk-20.11 移植 intel E810 百 G 网卡 pmd 驱动到 dpdk-16.04 中
Daily sql - judgment + aggregation
拼多多API接口(附上我的可用API)
Redis源码-String:Redis String命令、Redis String存储原理、Redis字符串三种编码类型、Redis String SDS源码解析、Redis String应用场景
sql--Users who have purchased more than 3 times (inclusive) within 7 days (including the current day), and the purchase amount in the past 7 days exceeds 1,000
Taobao sku API interface (PHP example)
实现通用的、高性能排序和快排优化
基于FPGA的FIR滤波器的实现(5)— 并行结构FIR滤波器的FPGA代码实现