首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >系统的返回值(“path/a.out”)

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

Stack Overflow用户
提问于 2013-09-02 13:16:53
回答 2查看 184关注 0票数 1

我的想法是尝试在另一个程序的条件语句中使用system的返回值,下面是我得出的结论:

第一个节目:

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>

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

第二个程序(一个呼叫系统()):

代码语言:javascript
复制
#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查看系统的返回值(如果是256时,程序应该返回1 (0很好)时)时,程序总是返回1,当我用return 2替换return 1时,得到了510。我不知道它们是怎么回事,但它让我想起了在return 1情况下一个字节中可能出现的组合数,以及在return 2中以9位为单位的组合数,就像程序正在执行(255 << (i - 1)) + 1,其中i是返回值和i > 0

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-02 13:31:35

目前的情况是确定执行情况。C11 7.22.4.8/3 (system)说:

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

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

代码语言:javascript
复制
#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的状态。

票数 4
EN

Stack Overflow用户

发布于 2013-09-02 13:40:00

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

如果出现错误,返回的值是-1 (例如叉(2)失败),否则返回命令的状态是-1。后一种返回状态是等待(2)中指定的格式。因此,该命令的退出代码将是WEXITSTATUS(status)。

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

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

代码语言:javascript
复制
#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(Statuc)宏告诉您第一个程序是否正常退出,如果退出,WEXITSTATUS(statuc)宏将给出返回值。

免责声明:我没有运行这个代码,可能会有一些错误在那里。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18574242

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档