什么会导致MSVCRT system()函数总是返回1错误代码,即使应用程序被执行并成功退出,并返回0作为其退出代码?
我用TDM-GCC-4.9.2和FASM进行了测试,只调用system()并打印返回代码,它们都打印-1,所以它不是我的开发环境。
同时errno在调用system()后为0,GetLastError返回18没有更多的文件,这是奇怪的。
事实上,我系统中使用system()的每个应用程序现在都假设它失败了。
因此,这是MSVCRT的一个全球性问题,我似乎无法在任何其他机器上复制,一些帮助将不胜感激。
编辑:经过一些调试,system调用_spawnve,然后调用CreateProcessA。在可执行文件终止后,它调用WaitForSingleObject并返回-1,然后将其反馈到链上。
编辑2:经过更多的测试,如果被调用的进程返回0,它似乎只返回-1,否则返回正确的值。
编辑3:为了澄清,即使GetExitCodeProcess返回-1,被调用的进程也会成功执行。
编辑4:这是我的测试来源。
总是返回0成功的:

#include <stdio.h>

int main( int argc, char* argv[argc]) {
    printf("success\n");
    return 0;
}

总是失败的人:
#include <stdio.h>

int main( int argc, char* argv[argc]) {
    printf("failure\n");
    return 1;
}

那个叫它的人:
#include <stdlib.h>
#include <stdio.h>

int main( int argc, char* argv[argc]) {
    printf( "success == %d %d\n", system("test_success.exe", errno);
    printf( "failure == %d %d\n", system("test_fail.exe", errno);
    return 0;
}

其结果是:
success
success == -1 0
failure
failure == 1 0

编辑5:因为systemcallssystemcallssystem我都试过了,当调用_spawnve时它们都返回-1,但是当调用CreateProcess时它们按预期工作。
因此,这似乎是一个与cmd /c test_success没有直接关系的深层次问题。
编辑6:在我做了很多手脚之后,我把cmd /c test_fail改成了system,现在一切都正常了!
这有点奇怪,因为我是英特尔酷睿2的组合,这可能不是正确的做法,但我还是很满意:p

最佳答案

我给自己加了一个答案,因为我认为这已经完成了。
ComSpecC:\Windows\System32\cmd.exe改为C:\Windows\winsxs\amd64_microsoft-windows-commandprompt_31bf3856ad364e35_6.1.7601.17514_none_e932cc2c30fc13b0\cmd.exe解决了我用伪退出码解决的所有问题。

10-07 13:46
查看更多