什么会导致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:因为
system
callssystem
callssystem
我都试过了,当调用_spawnve
时它们都返回-1,但是当调用CreateProcess
时它们按预期工作。因此,这似乎是一个与
cmd /c test_success
没有直接关系的深层次问题。编辑6:在我做了很多手脚之后,我把
cmd /c test_fail
改成了system
,现在一切都正常了!这有点奇怪,因为我是英特尔酷睿2的组合,这可能不是正确的做法,但我还是很满意:p
最佳答案
我给自己加了一个答案,因为我认为这已经完成了。
将ComSpec
从C:\Windows\System32\cmd.exe
改为C:\Windows\winsxs\amd64_microsoft-windows-commandprompt_31bf3856ad364e35_6.1.7601.17514_none_e932cc2c30fc13b0\cmd.exe
解决了我用伪退出码解决的所有问题。