当前位置:网站首页>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 进程后退出
边栏推荐
- Edge 提供了标签分组功能
- daily sql - user retention rate for two days
- 【推荐系统】:协同过滤和基于内容过滤概述
- 每日sql -查询至少有5名下属的经理和选举
- 那些事情是用Unity开发项目应该一开始规划好的?如何避免后期酿成巨坑?
- Redis源码-String:Redis String命令、Redis String存储原理、Redis字符串三种编码类型、Redis String SDS源码解析、Redis String应用场景
- NFT 的价值从何而来
- Redis源码:Redis源码怎么查看、Redis源码查看顺序、Redis外部数据结构到Redis内部数据结构查看源码顺序
- concept noun
- Unity底层是如何处理C#的
猜你喜欢
随机推荐
Daily sql-seek the sum of successful investments in 2016
一张图了解JVM八大原子操作
技能在赛题解析:交换机防环路设置
软件测试基本流程有哪些?北京专业第三方软件检测机构安利
concept noun
1688商品详情接口
Spatial Pyramid Pooling -Spatial Pyramid Pooling (including source code)
淘宝API常用接口与获取方式
图文带你理解什么是Few-shot Learning
buu—Re(5)
MySQL之函数
HCIP OSPF dynamic routing protocol
空间金字塔池化 -Spatial Pyramid Pooling(含源码)
Pinduoduo API interface (attach my available API)
Daily sql: request for friend application pass rate
Attitude solution - gyroscope + Euler method
torch.cat()使用方法
MySQL01
Resolved EROR 1064 (42000): You have an error in. your SOL syntax. check the manual that corresponds to yo
每日sql:求好友申请通过率









