MSVCRT系统函数返回码始终为

什么会导致MSVCRT system()函数始终返回-1错误代码,即使应用程序已成功执行并退出并返回0作为其退出代码?

我用TDM-GCC-4.9.2和FASM做了测试,它只调用system()并打印返回码,并且它们都打印-1,所以它不是我的开发环境。

调用system()errno0GetLastError返回18没有更多的文件,这是奇怪的。

事实上,我的系统上使用system()每个应用程序现在总是认为它失败了。

所以这是一个MSVCRT的全球性问题,我似乎无法在任何其他机器上重现,有些帮助将不胜感激。

编辑 :经过一些调试后, system调用_spawnve ,然后调用CreateProcessA然后WaitForSingleObject 。 在可执行文件终止之后,它会调用GetExitCodeProcess并返回-1 ,然后将其反馈回链。

编辑2 :经过一些更多的测试后,似乎system只返回-1,如果被调用的进程返回0,否则它返回正确的值。

编辑3 :只是澄清,即使system返回-1 ,被调用的进程成功执行。

编辑4 :这是我的测试来源。
总是返回0成功的那个:

#include <stdio.h>

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

总是失败的那个:

#include <stdio.h>

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

而那个叫它的人:

#include <stdlib.h>
#include <stdio.h>

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

这个输出是:

success
success == -1 0
failure
failure == 1 0

编辑5 :因为system调用_spawnve调用CreateProcess我试了一下,他们都调用cmd /c test_success时返回-1 ,但是当调用cmd /c test_fail他们按预期工作。 所以这似乎是一个与system无直接关系的更深层次的问题。

编辑6 :经过很多faffing我把ComSpec改为C:Windowswinsxsamd64_microsoft-windows-commandprompt_31bf3856ad364e35_6.1.7601.17514_none_e932cc2c30fc13b0cmd.exe ,现在一切正常! 自从使用英特尔酷睿2双核处理器后,这有点奇怪,它可能不是正确的做法,但仍然很满意:p


我为自己添加一个答案,因为我认为这样做了。

ComSpecC:WindowsSystem32cmd.exe更改为C:Windowswinsxsamd64_microsoft-windows-commandprompt_31bf3856ad364e35_6.1.7601.17514_none_e932cc2c30fc13b0cmd.exe解决了我使用伪造退出代码所遇到的所有问题。


这里是'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.
链接地址: http://www.djcxy.com/p/79913.html

上一篇: MSVCRT system function return code is always

下一篇: MinGW doesn't produce warnings