golang利用cmd跨平台管道通信

本文探讨了在不同操作系统环境下,如何通过`os.Pipe()`实现程序间通信,特别关注了Linux与Windows下命令执行管道的差异。关键在于理解如何设置`cmd.SysProcAttr`和`cmd.ExtraFiles`,以确保跨平台命令执行的正确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

废话不多说,直接上代码,简单清晰明了

	cmd := exec.Command(execPath)
	var rx_r, rx_w, tx_r, tx_w *os.File
	rx_r, rx_w, err = os.Pipe()
	if err != nil {
		return
	}
	tx_r, tx_w, err = os.Pipe()
	if err != nil {
		return
	}
	cmd.SysProcAttr = &syscall.SysProcAttr{} //Setpgid: true
	if runtime.GOOS == "linux" {
		cmd.ExtraFiles = append(cmd.ExtraFiles, tx_r, rx_w)
	}
	if runtime.GOOS == "windows" {
		cmd.Stdin = tx_r
		cmd.Stdout = rx_w
	}
	err = cmd.Start()
	tx_r.Close()
	rx_w.Close()

最终rx_r为 “execPath” 启动程序的读取管道,由于windows下设置ExtraFiles 之后start里的实现会有一个判断,最终导致失败,所以windows和linux下的参数改变是不一样的,这个需要特别注意!!!!!
注:runtime.GOOS在“runtime”包中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值