什么可能导致MSVCRT system()
函数始终返回 -1 错误代码,即使应用程序已成功执行并退出并返回 0 作为退出代码?
我用TDM-GCC-4.9.2和FASM进行了测试,只调用system()
并打印返回代码,并且它们都打印 -1 所以它不是我的开发环境。
调用errno
后system()
0 ,GetLastError
返回 18 没有更多文件,这很奇怪。
实际上我的系统上使用system()
的每个应用程序现在总是认为它失败了。
所以这是一个MSVCRT的全局问题,我似乎无法在任何其他机器上重现,一些帮助将不胜感激。
编辑:经过一些调试后,system
会调用_spawnve
,然后调用CreateProcessA
,然后调用WaitForSingleObject
。在可执行文件终止后,它会调用GetExitCodeProcess
,然后返回 -1 ,然后反馈到链中。
编辑2 :经过多次测试后,如果调用的进程返回 0 ,则system
似乎只返回 -1 它返回正确的值。
编辑3 :只是为了澄清,即使system
返回 -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
拨打_spawnve
来电CreateProcess
,我尝试了所有这些,并且当他们都返回 -1 时调用cmd /c test_success
,但在调用cmd /c test_fail
时,它们按预期工作。
所以这似乎是一个与system
没有直接关系的深层问题。
编辑6 :经过多次改变后,我将ComSpec
更改为C:\Windows\winsxs\amd64_microsoft-windows-commandprompt_31bf3856ad364e35_6.1.7601.17514_none_e932cc2c30fc13b0\cmd.exe
,现在一切正常!
这是有点奇怪,因为我在英特尔酷睿2双核,它可能不是正确的事情在这里做,但仍然满意:p
答案 0 :(得分:0)
我为自己添加了一个答案,因为我认为这样做了。
将ComSpec
从C:\Windows\System32\cmd.exe
更改为C:\Windows\winsxs\amd64_microsoft-windows-commandprompt_31bf3856ad364e35_6.1.7601.17514_none_e932cc2c30fc13b0\cmd.exe
解决了我使用伪造退出代码时出现的所有问题。
答案 1 :(得分:-1)
这里是'system()'手册对返回值
的说法 The value returned is -1 on error (e.g., fork(2) failed), and the
return status of the command otherwise. This latter return status is
in the format specified in wait(2). Thus, the exit code of the command
will be WEXITSTATUS(status). In case /bin/sh could not be executed,
the exit status will be that of a command that does exit(127).
If the value of command is NULL, system() returns nonzero if the shell
is available, and zero if not.
system() does not affect the wait status of any other children.