你正在使用的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会话上运行。
8条答案
按热度按时间46qrfjad1#
你是否能提出一个特定的更改,使其能够工作?
cc @golang/windows
qij5mzcb2#
请问您是否能提供具体的更改建议,以便我们解决这个问题?
cc @golang/windows
是的,我刚刚提交了 #62710 来修复这个问题。
oxalkeyp3#
https://go.dev/cl/529315提到了这个问题:
syscall: add SysProcAttr.PseudoConsole on Windows
dddzy1tm4#
这个建议没有包含支持ConPty所需的必要API更改。从我在这个关联的CL 529315中看到的内容来看,它只需要在syscall.SysProcAttr中添加以下内容:
阅读文档并查看一些代码示例,添加这个新属性似乎足以创建伪控制台会话。我找不到的是关于为什么它排除了继承其他句柄的文档。你能帮助我理解这一点吗?
yv5phkfx5#
这个建议没有包含支持ConPty所需的必要API更改。从我在这个关联的CL 529315中看到的内容来看,它只需要在syscall.SysProcAttr中添加以下内容:
这是正确的。这就是CL 528915在其中发挥作用的地方,将ConPTY API添加到sys/windows中。我们需要CL 529315来支持在ConPTY上运行进程。
阅读文档并查看一些代码示例,添加这个新属性似乎足以创建伪控制台会话。我找不到关于为什么它排除了继承其他句柄的文档。你能帮我理解这一点吗?
我在文档中找不到任何信息。我找到的唯一评论来自hcsshim:“如果客户端请求了一个伪控制台,那么我们不需要做管道方面的任何事情,因为进程会继承pty的其他端。”
编辑:添加node-pty和microsoft/node-pty#334作为参考
0g0grzrc6#
感谢您的分享。我了解到ConPty存在一个bug,当继承句柄时会导致其表现异常。既然这样做没有意义,那么句柄继承功能就被禁用了。虽然看起来有些模糊,但这让我确信了这一点。
im9ewurl7#
关于这个的更新情况如何?#62710 只需要在
syscall.SysProcAttr
上添加一个内容,就可以使得在 ConPty 上生成进程成为可能。CC/ @bcmills@thanm@qmuntal
aamkag618#
这个项目有任何更新吗?
它仍然需要完成提案过程并获得批准。下一步是由提案团队讨论这个提案,但由于提案队列很大,可能需要一段时间。