从C ++中的系统函数中获取一个整数(大于255)

时间:2017-09-26 17:14:07

标签: c++ bash return system

我有一个相对简单的问题,我似乎无法做到。我需要做的是使用C ++程序中的system函数从bash脚本中检索整数。我的理解是system默认返回一个整数,所以我应该做一些像

这样的事情
int returnedVal = system ("myscript");

然而,主要问题是bash脚本没有返回值,只是一个0到255之间的标志,表示它们是否成功。我尝试过在脚本中写入文本文件然后读取文件,但是这会引起一些问题,如果可能的话我想避免这种情况。有谁知道最简单的方法吗?非常感谢提前。

3 个答案:

答案 0 :(得分:3)

POSIX退出(3)说:

  

状态值可以是0,EXIT_SUCCESS,EXIT_FAILURE,[CX] [选项   开始]或任何其他值,但只有最低有效8位   (即状态&0377)应该等待父母   过程

这意味着没有大于8位可能表示的值可以通过调用exit退出正常的进程终止,然后父进程无法捕获更多。

更多相关内容。不要使用返回值来传输某些数据,它主要用于表示成功或失败状态。 0值表示成功,任何其他表示失败。

如果您希望您的进程进行通信,那么您需要一些通信通道(文件,管道等)。

答案 1 :(得分:1)

如果myscript - 像许多脚本或程序 - write(2) - 在 stdout 上的某些内容(例如某些数字或字符串),您可以使用(在POSIX上){ {3}}在你的程序中。 成功后popen会为FILE*例程提供<stdio.h>流(您可以使用fscanf等阅读)。

(我猜您正在使用某些Linux或POSIX系统)

popen(3)获取myscript的{​​{3}}状态(实际上还有其他终结点,例如system(3) - s,请参阅exit(3)))myscript。它并不关心fclose的输出,它会插入到程序的标准输出中。

请勿忘记使用signal(7)(不是popen)来关闭wc -l /etc/fstab - ed流。另请阅读waitpid(2

例如,此代码从FILE*p = popen("wc -l /etc/fstab", "r"); if (!p) { perror("popen"); exit(EXIT_FAILURE); }; int n= 0; if (fscanf(p,"%d", &n)<=0) { perror("fscanf"); exit(EXIT_FAILURE; }; if (pclose(p)>0) /*wc failed*/ exit(EXIT_FAILURE); printf("your fstab has %d lines\n", n); 命令

的输出中读取数字
popen

您应该阅读pclose(3)(可免费下载)。您可能想要使用其他东西(例如一些系统调用,如fork(2),execve(2),waitpid(2),pipe(2),dup2(2);请参阅pipe(7))。

还有很多其他方法可以做一些Advanced Linux Programming,包括syscalls(2) - s和Inter-Process Communication - s。

在使用systemid | color_id | size_id 时,请注意fifo(7)一些包含命令的计算字符串。

某些库(尤其是C ++的socket(7)code injection)提供了运行程序和与之通信的其他方法。

答案 2 :(得分:0)

system man page在讨论了各种各样的失败之后说:

  

如果所有系统调用都成功,则返回值为             用于执行命令的子shell的终止状态。             (shell的终止状态是终止状态             它执行的最后一个命令。)

为清楚起见,可以添加shell的退出值是exit命令的数字参数,或者 - 如果没有遇到 - 执行的最后一个命令的退出状态,即{的值{1}}。该退出值由操作系统通过waitpid() function.传递给shell的父级(可能是另一个shell)。这样,“leaf”进程的退出状态将传播到$?,并且最后你的计划。

我不明白为什么你不想做什么。

相关问题