当前位置:网站首页>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 进程后退出
边栏推荐
- HCIP OSPF/MGRE Comprehensive Experiment
- 皮质-皮质网络的多尺度交流
- LabelEncoder和LabelBinarizer的区别
- Find the shops that have sold more than 1,000 yuan per day for more than 30 consecutive days in the past six months
- 淘宝sku API 接口(PHP示例)
- 每日sql-求2016年成功的投资总和
- 软件测试基本流程有哪些?北京专业第三方软件检测机构安利
- 详解BLEU的原理和计算
- 已解决EROR 1064 (42000): You have an error in. your SOL syntax. check the manual that corresponds to yo
- 强烈推荐一款好用的API接口
猜你喜欢

Douyin get douyin share password url API return value description

亚马逊获得AMAZON商品详情 API 返回值说明

Especially the redis

第一个C函数:如何实现板级初始化?

每日sql-统计各个专业人数(包括专业人数为0的)

MySQL导入导出&视图&索引&执行计划

jar服务导致cpu飙升问题-带解决方法

JD.com product details API call example explanation

《Show and Tell: A Neural Image Caption Generator》论文解读

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
buu—Re(5)
常见激活函数及其导数
sql--7天内(含当天)购买次数超过3次(含),且近7天的购买金额超过1000的用户
Do not add the is prefix to the variables of the boolean type in the POJO class of the Alibaba specification
Find the shops that have sold more than 1,000 yuan per day for more than 30 consecutive days in the past six months
强烈推荐一款好用的API接口
博途PLC 1200/1500PLC ModbusTcp通信梯形图优化汇总(多服务器多从站轮询)
Redis源码:Redis源码怎么查看、Redis源码查看顺序、Redis外部数据结构到Redis内部数据结构查看源码顺序
OA Project Pending Meeting & History Meeting & All Meetings
Cobbleland 博览会 基础系列 1
《Generative Adversarial Networks》
抖音关键词搜索商品-API工具
opencv实现数据增强(图片+标签)平移,翻转,缩放,旋转
实现通用的、高性能排序和快排优化
MySQL之函数
1688 product interface
torch.cat()使用方法
会议OA项目之我的会议
每日sql-统计各个专业人数(包括专业人数为0的)