C++使用system API调用PowerShell脚本时errno未被正确设置
问题原因分析
1. errno的设计逻辑决定不会同步子进程退出码
errno是C标准库定义的全局变量,仅用于记录C标准库函数自身执行时发生的系统级错误。对于system函数来说,只有出现「无法创建子进程」「无法启动shell执行命令」这类system本身调用失败的场景时,才会设置errno。
你当前场景中PowerShell进程可以正常启动、运行直至退出,system函数本身执行是成功的,所以errno始终为0属于正常行为,子进程的自定义退出码完全不会影响errno的取值。
2. system函数返回值的解析方式错误
system的返回值不等于子进程的退出码,而是waitpid系统调用返回的进程状态编码,必须通过指定宏解析才能拿到真实的子进程退出码:
- 跨平台通用解析逻辑:先通过
WIFEXITED宏判断进程是否为正常退出,确认正常退出后再用WEXITSTATUS宏取出子进程的退出码 - Windows平台也可直接将
system返回值右移8位,得到子进程退出码
你直接打印system返回值的方式是错误的,拿到的不是脚本的实际退出码。
3. PowerShell脚本的退出码设置逻辑有误
你写的ExitWithCode函数中,$host.SetShouldExit()仅在PowerShell交互式宿主场景下生效,非交互模式通过-File参数调用脚本时,必须直接给exit语句传递退出码才会被外部进程捕获。你当前代码中的exit没有携带参数,默认返回的退出码就是0,这也是你拿到的结果和预期不符的核心原因之一。
正确的脚本写法参考:
#------------------------------------------------------------------------------- function ExitWithCode { #------------------------------------------------------------------------------- param($exitcode) $host.SetShouldExit($exitcode) exit $exitcode } ExitWithCode -exitcode 1
内容的提问来源于stack exchange,提问作者Aryaman Gupta
相关产品推荐
相关产品推荐

