我有一个相对简单的问题,我似乎无法做到。我需要做的是使用C ++程序中的system
函数从bash脚本中检索整数。我的理解是system
默认返回一个整数,所以我应该做一些像
int returnedVal = system ("myscript");
然而,主要问题是bash脚本没有返回值,只是一个0到255之间的标志,表示它们是否成功。我尝试过在脚本中写入文本文件然后读取文件,但是这会引起一些问题,如果可能的话我想避免这种情况。有谁知道最简单的方法吗?非常感谢提前。
答案 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。
在使用system
或id | 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”进程的退出状态将传播到$?
,并且最后你的计划。
我不明白为什么你不想做什么。