1

我有这个想法尝试在另一个程序的条件语句中使用 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");
}

但这不起作用,因为you answered no当我使用 printf 查看 system 的返回值时程序总是返回,如果当我替换为I got256时程序应该返回1(0 工作正常)。我不知道他们发生了什么,但它让我想起了这种情况下一个字节中可能的组合数量以及 9bits 中的组合数量,就像程序正在执行 返回值和.return 1return 2510return 1return 2(255 << (i - 1)) + 1ii > 0

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

4

2 回答 2

4

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

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

那么,您的系统发生了什么?我假设您使用的是 Linux,并且system是根据fork,execwait. 最后一个,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

于 2013-09-02T13:31:35.323 回答
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) 宏会给你返回值。

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

于 2013-09-02T13:40:00.597 回答