You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 18:13:26