Odin中调用os2.process_exec创建进程失败求助(Windows)
在Odin中执行进程(Windows环境)
问题分析
你的代码执行失败是因为Windows下echo是cmd.exe的内置命令,并非独立可执行文件,直接调用{"echo", "hello"}会导致系统找不到可执行程序;同时原代码未正确捕获并读取标准输出流,所以输出空切片。
修正后的可运行代码
package main import "core:fmt" import "core:os2" import "core:context" import "core:io" main :: proc() { proc_desc := os2.Process_Desc{ // Windows下通过cmd.exe执行内置命令,/c表示执行后退出cmd command = {"cmd.exe", "/c", "echo", "hello"}, // 显式开启stdout和stderr捕获 stdout = .CAPTURE, stderr = .CAPTURE, } state, stdout_handle, stderr_handle, err := os2.process_exec(proc_desc, context.temp_allocator) defer os2.close_handle(stdout_handle) defer os2.close_handle(stderr_handle) if err != nil { fmt.printf("进程启动失败: %v\n", err) return } // 读取标准输出内容 stdout_buf := make([]u8, 1024) read_count, read_err := io.read(stdout_handle, stdout_buf) if read_err != nil && read_err != io.EOF { fmt.printf("读取stdout错误: %v\n", read_err) } else if read_count > 0 { fmt.printf("stdout: %s", string(stdout_buf[:read_count])) } // 读取标准错误内容 stderr_buf := make([]u8, 1024) read_count, read_err = io.read(stderr_handle, stderr_buf) if read_err != nil && read_err != io.EOF { fmt.printf("读取stderr错误: %v\n", read_err) } else if read_count > 0 { fmt.printf("stderr: %s", string(stderr_buf[:read_count])) } fmt.printf("进程执行成功: %t\n", state.success) }
核心要点
- 内置命令处理:Windows系统的
echo、dir等命令属于cmd.exe的内置指令,必须通过cmd.exe /c <命令>的形式调用,/c参数用于执行命令后自动关闭cmd进程。 - 流捕获配置:需要在
Process_Desc中显式设置stdout = .CAPTURE和stderr = .CAPTURE,否则无法捕获进程输出。 - 资源释放:使用
os2.close_handle()关闭进程句柄,这是Odin标准库中正确的资源释放方式,而非delete。 - 输出读取:捕获到的流句柄需要通过
io.read()读取内容,直接打印句柄或未读取的切片会显示为空。
内容的提问来源于stack exchange,提问作者AyeAreEm
相关产品推荐
相关产品推荐

