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

Obtaining an integer (greater than 255) from the system function in C++

本文关键字:大于 整数 函数 系统 获取      更新时间:2023-10-16

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

之类的事情
int returnedVal = system ("myscript");

然而,主要问题是bash脚本没有返回值,仅在0到255之间的标志才能成功。我尝试做一些事情,例如在脚本中写入文本文件,然后在文件中阅读,但是这引起了一些问题,我想避免使用。有人知道最简单的方法吗?非常感谢。

posix exit(3)说:

状态的值可能为0,exit_success,exit_failure,[cx] [选项 启动]或任何其他值,尽管只有最低的8位 (即状态& 0377)应向等待的父母使用 过程。

这意味着没有大于8位可以通过呼叫exit从正常过程终止终止的值更大的值,然后父母无法捕获更多。

更多。不要使用返回的值传输一些数据,它主要旨在代表成功或失败状态。0值代表成功,其他任何失败。

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

如果 myscript-例如许多脚本或程序 - 在其 stdout 上写(例如某些数字或字符串)(例如某些数字或字符串),您可以使用(ON ON)POSIX)POPEN(3)在您的程序中。成功的popen将为<stdio.h>例程提供FILE*流(您可以使用fscanf等阅读)。

(我猜您正在使用一些Linux或Posix系统)

但是系统(3)捕获出口(3)状态(实际上也是其他终止,例如信号(7)-s,请参见myscript的WaitPID(2))。它不在乎插入程序标准输出中的myscript的输出。

不要忘记使用PCLOSE(3)(不是fclose)关闭popen -ED流。另请阅读管道(7)。

例如,此代码从wc -l /etc/fstab命令

的输出中读取数字
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 linesn", n);

您应该阅读高级Linux编程(可自由下载)。您可能需要使用其他东西(例如,某些系统调用,例如fork(2),execve(2),waitpid(2),pipe(2),dup2(2);请参见syscalls(2))。

还有许多其他方法可以进行一些过程间通信,包括FIFO(7)-S和插座(7)-s。

使用popensystem,当心注入代码注入,某些计算的字符串包含命令。

一些库(特别是C 的QT或POCO)提供其他运行程序和与它们进行通信的方式。

system人页面说,在讨论了各种失败之后:

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

为了清楚起见,可以补充说,Shell的退出值是exit命令的数值参数,或者Mdash;如果没有遇到&mdash;执行的最后一个命令的退出状态,即$?的值。该退出值由操作系统通过waitpid()函数传递给Shell的父(可能是另一个外壳)。这样,"叶"过程的退出状态被传播到达到system,最后您的程序。

我不明白为什么您想做什么不可能。