go 建议:os/exec,系统调用:支持在Windows上的ConPty上运行进程,

djp7away  于 4个月前  发布在  Go
关注(0)|答案(8)|浏览(123)

你正在使用的Go版本是什么( go version )?

$ go version
go version go1.21.1 windows/amd64

这个问题在最新版本的发布中是否重现?

是的

你正在使用什么操作系统和处理器架构( go env )?

go env 输出

$ go env
set GO111MODULE=
set GOARCH=amd64
set GOBIN=
set GOCACHE=C:\Users\Ayman\AppData\Local\go-build
set GOENV=C:\Users\Ayman\AppData\Roaming\go\env
set GOEXE=.exe
set GOEXPERIMENT=
set GOFLAGS=
set GOHOSTARCH=amd64
set GOHOSTOS=windows
set GOINSECURE=
set GOMODCACHE=C:\Users\Ayman\go\pkg\mod
set GONOPROXY=
set GONOSUMDB=
set GOOS=windows
set GOPATH=C:\Users\Ayman\go
set GOPRIVATE=
set GOPROXY=https://proxy.golang.org,direct
set GOROOT=C:\Program Files\Go
set GOSUMDB=sum.golang.org
set GOTMPDIR=
set GOTOOLCHAIN=auto
set GOTOOLDIR=C:\Program Files\Go\pkg\tool\windows_amd64
set GOVCS=
set GOVERSION=go1.21.1
set GCCGO=gccgo
set GOAMD64=v1
set AR=ar
set CC=gcc
set CXX=g++
set CGO_ENABLED=1
set GOMOD=NUL
set GOWORK=
set CGO_CFLAGS=-O2 -g
set CGO_CPPFLAGS=
set CGO_CXXFLAGS=-O2 -g
set CGO_FFLAGS=-O2 -g
set CGO_LDFLAGS=-O2 -g
set PKG_CONFIG=pkg-config
set GOGCCFLAGS=-m64 -mthreads -Wl,--no-gc-sections -fmessage-length=0 -ffile-prefix-map=C:\Users\Ayman\AppData\Local\Temp\go-build1093290718=/tmp/go-build -gno-record-gcc-switches

你做了什么?

Windows现在支持使用它们的 Console API 创建伪控制台。目前,我们无法在ConPty上运行一个进程,这是由于ConPty需要使用Pty句柄和伪控制台属性( PROC_THREAD_ATTRIBUTE_PSEUDOCONSOLE = 0x00020016 )更新进程属性,而目前没有方法可以将Pty句柄传递给 syscall.StartProcess
参考: https://learn.microsoft.com/en-us/windows/console/creating-a-pseudoconsole-session
相关: golang/sys#175

你期望看到什么?

进程在ConPty会话上运行。

你实际看到了什么?

进程 没有 在ConPty会话上运行。

46qrfjad

46qrfjad1#

你是否能提出一个特定的更改,使其能够工作?
cc @golang/windows

qij5mzcb

qij5mzcb2#

请问您是否能提供具体的更改建议,以便我们解决这个问题?
cc @golang/windows
是的,我刚刚提交了 #62710 来修复这个问题。

oxalkeyp

oxalkeyp3#

https://go.dev/cl/529315提到了这个问题:syscall: add SysProcAttr.PseudoConsole on Windows

dddzy1tm

dddzy1tm4#

这个建议没有包含支持ConPty所需的必要API更改。从我在这个关联的CL 529315中看到的内容来看,它只需要在syscall.SysProcAttr中添加以下内容:

type SysProcAttr struct {
        ...
	PseudoConsole              Handle              // if non-zero, the new process will be attached to the console represented by this handle, any AdditionalInheritedHandles will be ignored, this implies NoInheritHandles
}

阅读文档并查看一些代码示例,添加这个新属性似乎足以创建伪控制台会话。我找不到的是关于为什么它排除了继承其他句柄的文档。你能帮助我理解这一点吗?

yv5phkfx

yv5phkfx5#

这个建议没有包含支持ConPty所需的必要API更改。从我在这个关联的CL 529315中看到的内容来看,它只需要在syscall.SysProcAttr中添加以下内容:

这是正确的。这就是CL 528915在其中发挥作用的地方,将ConPTY API添加到sys/windows中。我们需要CL 529315来支持在ConPTY上运行进程

阅读文档并查看一些代码示例,添加这个新属性似乎足以创建伪控制台会话。我找不到关于为什么它排除了继承其他句柄的文档。你能帮我理解这一点吗?

我在文档中找不到任何信息。我找到的唯一评论来自hcsshim:“如果客户端请求了一个伪控制台,那么我们不需要做管道方面的任何事情,因为进程会继承pty的其他端。”

编辑:添加node-pty和microsoft/node-pty#334作为参考

0g0grzrc

0g0grzrc6#

感谢您的分享。我了解到ConPty存在一个bug,当继承句柄时会导致其表现异常。既然这样做没有意义,那么句柄继承功能就被禁用了。虽然看起来有些模糊,但这让我确信了这一点。

im9ewurl

im9ewurl7#

关于这个的更新情况如何?#62710 只需要在 syscall.SysProcAttr 上添加一个内容,就可以使得在 ConPty 上生成进程成为可能。
CC/ @bcmills@thanm@qmuntal

aamkag61

aamkag618#

这个项目有任何更新吗?
它仍然需要完成提案过程并获得批准。下一步是由提案团队讨论这个提案,但由于提案队列很大,可能需要一段时间。

相关问题