【问题标题】:C - system function always returns -1C - 系统函数总是返回 -1
【发布时间】:2016-01-09 12:19:11
【问题描述】:

每次我使用 system() 函数在 c 中编写最简单的程序时,它都会返回 -1。 例如:

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

int main()
{
    printf("%d", system("pause"));
    return 0;
}

我使用了多个编译器来确保它不能仅与 gcc 一起使用。 每个 cmd 命令都会发生这种情况。 当我在 cmd 中键入命令时,它们工作正常。 该程序只是跳过每个 system() 函数调用。 附言我正在使用 Windows 8.1 和 GNU 编译器(gcc)。

有人知道我应该怎么做吗?

【问题讨论】:

  • 你怎么知道它返回-1?另外,"pause" 不是标准的命令行命令,它是特定于 MS-DOS 的。
  • 我打印 system() 函数返回的值。
  • 您在发布的代码中没有这样做,还要指定发生这种情况的环境,例如操作系统。
  • 你是在 bash shell 中执行它吗?
  • @iharob 我在命令提示符下运行编译好的exe文件。

标签: c


【解决方案1】:

当某些库函数出错时,请尝试检查它的确切错误。阅读文档(MSDNman page 等等)是一个非常好的主意。 C标准库函数一般设置全局errno变量,也有将代码转换为字符串的函数。所以尝试这样的事情:

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

#include <errno.h>
#include <string.h>

int main()
{
    int result = system("pause");
    // note: have to use temp variable for return value,
    // because function argument evaluation order is not defined in C
    printf("system return value %d errno %d = %s\n", result, errno, strerror(errno));
    // note, printf may set errno too, so it may have different value after above call
    return 0;
}

当我将上面的程序复制粘贴到 foo.c 时,启动由 Qt SDK 安装的 "Qt 5.5 for Desktop (MinGW 4.9.2 32 bit)"像这样工作(从控制台窗口有点缩短/清理复制粘贴):

C:\Users\hyde\foo>dir
 Directory of C:\Users\hyde\foo
10.01.2016  10:25               443 foo.c

C:\Users\hyde\foo>mingw32-make foo
g++     foo.c   -o foo

C:\Users\hyde\foo>dir
 Directory of C:\Users\hyde\foo
10.01.2016  10:25               443 foo.c
10.01.2016  10:28            47 445 foo.exe

C:\Users\hyde\foo>foo
Press any key to continue . . .
system return value 0 errno 0 = No error

C:\Users\hyde\foo>

【讨论】:

  • 首先:感谢您的回答!我试过你的代码,程序打印:-1 errno 22 = Invalid argument。我试着理解这是什么意思,我不知道......
  • @bobsfog 我也不知道...看起来很奇怪。你应该用你使用的编译器更新问题,也许是编译选项或执行的编译器命令行。
  • 如果您使用的是 gcc,我假设您使用的是 MinGW 或 Cygwin。所以我想system() 实际上会使用sh 来执行命令,而不是cmd.exe。所以试试这些 Unix shell 命令:ls 看看你是否得到目录列表,read foo 从用户那里读取,以达到与pause 类似的效果。
  • @bobsfog 附带说明一下,您不应该将system 用于...好吧,几乎可以用于任何事情。它在学习时对快速和肮脏的事情很有用,但如果你真的想启动另一个程序,你应该只在“真实”的应用程序中使用它。如果要清除屏幕或等待用户按键,请使用库/编写辅助函数,这些函数使用 C 标准库或操作系统特定库(Windows 控制台程序的 WIN32 API)来执行这些操作。 Stack Overflow 可能对如何做这些问题有很好的答案。
  • @bobsfog 我在构建和运行程序时添加了示例输出。它确实适用于pause。您也可以尝试安装我使用的相同环境,看看它是否仍然无法正常工作。如果没有,那么它肯定是系统问题(系统策略、病毒扫描程序、PATH 中的有趣的东西,等等)。如果它确实有效,那么它是您的构建环境的问题。
【解决方案2】:

这段代码(使用“ls”而不是“pause”)在 Ubuntu 中运行良好。我认为这取决于您的系统策略。

【讨论】:

  • 请解释一下政策
  • 我认为他的意思是操作系统或类似的东西。
  • 你误解了我的问题。该命令在 Windows 中被识别,问题不依赖于命令。我在 system() 函数中输入的每个命令都不起作用。
  • 它在 MS Windows 7 企业版上运行良好。我没有防病毒程序。系统策略意味着权限问题。
  • @LORDTEK 你知道我该如何解决这个问题吗?
【解决方案3】:

尝试右键单击 exe 并选择其他兼容模式之一。你的程序对我有用(Windows 7 Pro),所以我可以先试试那个。

【讨论】:

  • 我同意@hyde。发布有关您的环境、编译器、编译器选项的更多信息...
猜你喜欢
  • 2016-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-05
  • 1970-01-01
  • 1970-01-01
  • 2015-06-27
相关资源
最近更新 更多