系统的返回值(“path / a.out”)

时间:2013-09-02 13:16:54

标签: c function return-value

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

第一个程序:

#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");
}

但是这没有用,因为当程序应该返回you answered no时,当我使用printf查看系统的返回值if 256时,程序总是返回1当我用return 1替换return 2时我得到了510。 我不知道他们发生了什么,但它让我想起return 1案例中一个字节可能的组合数量和return 2中9个比特的组合数量,就像程序正在做的那样(255 << (i - 1)) + 1其中i是返回值,i > 0

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

2 个答案:

答案 0 :(得分:4)

情况是实施定义的。 C11 7.22.4.8/3(system)说:

  

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

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

#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正确地指出返回值是来自基础wait的状态。

答案 1 :(得分:2)

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

  

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

这意味着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)宏会给你返回值。

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