【问题标题】:the return value of system("path/a.out")system("path/a.out") 的返回值
【发布时间】:2013-09-02 13:16:53
【问题描述】:

我有这个想法尝试在另一个程序的条件语句中使用 system 的返回值,这是我想出的:

第一个程序:

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

main(void)
{
    char ans;
    scanf("%c" , &ans);
    if(ans == 'y' || ans == 'Y')
        return 1;
    else
        return 0;    
}

第二个程序(调用system()的那个):

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

main(void)
{
    if(system("/home/M435TR0x/a.out") == 1)
        printf("you answered yes\n");
    else
        printf("you answered no");
}

但这不起作用,因为当我使用 printf 查看系统的返回值时程序总是返回 you answered no 如果是 256 当程序应该返回 1 时(0 工作正常)当我替换return 1return 2 我得到了 510 。 我不知道他们发生了什么,但它让我想起return 1 的情况下一个字节中可能的组合数量以及return 2 中9位的组合数量,就像程序正在做(255 &lt;&lt; (i - 1)) + 1 一样i 是返回值,i &gt; 0

有人知道那里到底发生了什么吗?

【问题讨论】:

    标签: c function return-value


    【解决方案1】:

    情况由实现定义。 C11 7.22.4.8/3 (system) 说:

    如果参数不是空指针,并且system 函数确实返回,它返回一个实现定义的值。

    那么,您的系统发生了什么?我假设您使用的是 Linux,并且system 是根据forkexecwait 实现的。最后一个,wait,返回一个 status,它是一个 16 位整数,它告诉你进程是正常退出还是通过信号退出,以及返回值或信号是什么, 分别。要访问这些,请在man 2 wait 的返回值上使用system 中的宏。

    #include <stdlib.h.>    // for "system"
    
    #include <sys/types.h>
    #include <sys/wait.h>
    
    int n = system(cmd);
    
    • WIFEXITED(n)如果进程正常退出则为真;如果是这样,WEXITSTATUS(n) 会告诉你返回值。

    • WIFSIGNALED(n) 如果进程因信号而结束,则为真;如果是这样,WTERMSIG(n) 就是信号号。

    旁注:在我的 Linux 上,man 3 system 给出了错误信息,即返回值已经用WEXITSTATUS 处理,而最近的info system 正确地指出返回值是来自底层@987654338 的状态@。

    【讨论】:

    • 是的 man 3 系统真的让我很困惑,但我认为他们谈论的是 system 何时调用系统命令。但是WEXITSTATUS(n) 让我看到了真正的返回值。
    【解决方案2】:

    system 的手册页我们可以看到:

    错误时返回的值为 -1(例如 fork(2) 失败),并且 否则返回命令的状态。后一种返回状态是 以 wait(2) 中指定的格式。因此,退出代码 命令将是 WEXITSTATUS(status)。

    这意味着system返回一个需要“解释”才能获得程序返回值的状态号。

    因此,您可以在第二个程序上执行以下操作以获得所需的值:

    #include <sys/types.h>
    #include <sys/wait.h>
    
    int status = system("/home/M435TR0x/a.out");
    if (WIFEXITED(status)){
       if (WEXITSTATUS == 1) printf("you answered yes\n");
       else printf("you answered no");
    }
    

    WIFEXITED(status) 宏告诉你第一个程序是否正常退出,如果正常退出,WEXITSTATUS(statuc) 宏会给你返回值。

    免责声明:我没有运行此代码,其中可能存在一些错误。

    【讨论】:

      猜你喜欢
      • 2012-01-29
      • 1970-01-01
      • 1970-01-01
      • 2014-09-08
      • 2012-04-23
      • 2018-02-14
      • 2014-07-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多