我的想法是尝试在另一个程序的条件语句中使用system的返回值,下面是我得出的结论:
第一个节目:
#include <stdio.h>
#include <stdlib.h>
main(void)
{
char ans;
scanf("%c" , &ans);
if(ans == 'y' || ans == 'Y')
return 1;
else
return 0;
}第二个程序(一个呼叫系统()):
#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。
有人知道那里到底发生了什么吗?
发布于 2013-09-02 13:31:35
目前的情况是确定执行情况。C11 7.22.4.8/3 (system)说:
如果参数不是空指针,并且
system函数确实返回,则返回一个实现定义的值。
你的系统怎么了?我假设您使用的是Linux,system是用fork、exec和wait实现的。最后一个是wait,返回一个状态,它是一个16位整数,它告诉您进程是正常退出还是通过信号退出,以及返回值或信号分别是什么。要访问这些宏,请在man 2 wait的返回值system上使用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正确地声明返回值是来自底层wait的状态。
发布于 2013-09-02 13:40:00
从system的手册页面中我们可以看到:
如果出现错误,返回的值是-1 (例如叉(2)失败),否则返回命令的状态是-1。后一种返回状态是等待(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(Statuc)宏告诉您第一个程序是否正常退出,如果退出,WEXITSTATUS(statuc)宏将给出返回值。
免责声明:我没有运行这个代码,可能会有一些错误在那里。
https://stackoverflow.com/questions/18574242
复制相似问题