我有这个想法尝试在另一个程序的条件语句中使用系统的返回值,这是我想出的:
第一个程序:
#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
。
有人知道那里到底发生了什么吗?
答案 0 :(得分:4)
情况是实施定义的。 C11 7.22.4.8/3(system
)说:
如果参数不是空指针,并且
system
函数确实返回,则返回实现定义的值。
那么,你的系统上发生了什么?我假设您使用的是Linux,而system
是根据fork
,exec
和wait
实现的。最后一个wait
返回状态,它是一个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
正确地指出返回值是来自基础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)宏会给你返回值。
免责声明:我没有运行此代码,可能会有一些错误。