从 shell 返回值到 C 程序

returning value from shell to a C program

我的问题很简单:

我正在用 C 编写一个程序,结构如下:

int qty_used;

qty_used = system("df -h | grep 'sda1' | awk 'BEGIN{print "Use%"} {percent+=;} END{print percent}'");

if (qty_used<fixed_limit)
   /* action 1 */
else
   /* action 2*/;

所以如果是这种情况:

Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1       2.0T   30G  1.8T   2% /

我希望 qty_used 加载整数值 2。我以前从未使用过 awk,我从这个有前途的答案开始:https://unix.stackexchange.com/questions/64815/how-to-print-the-percentage-of-disk-use-from-df-hl。的输出:

df -h | grep 'sda1' | awk 'BEGIN{print "Use%"} {percent+=;} END{print percent}'

听起来不错。但是如果我要求 [我只想要整数]:

df -h | grep 'sda1' | awk 'BEGIN{percent+=;} END{print percent}'

然后输出为零,不再是 2

此外,我知道系统不会 return 我正在搜索的百分比,而是 return 命令的状态,这对我的需要没有用

所以问题是:有没有从这些行开始快速解决这个问题的方法?

感谢那些愿意提供帮助的人

一个简单的方法...

让最后一个函数 (awk) 将输出重定向到文件(使用“> 文件名”)

然后打开文件进行阅读并提取所需信息。

您需要了解 system() 函数 returns 一个与命令的 退出代码 相关的值,与输出无关命令。您还需要了解可能的退出代码范围非常小。

话虽如此,如果您只需要支持 0 到 100 之间的整数值,那么您应该能够使用适当的代码使命令退出。应该这样做:

#include <sys/types.h>
#include <sys/wait.h>

/* ... */

    qty_used = WEXITSTATUS(
            system("exit `df -h | awk '/sda1/{percent+=;} END{print percent}'`"));

更新:根据@EdMorton 的评论,从命令管道中删除了grep

这会增加 BEGIN 块中的百分比...

$ df -h | grep 'sda1' | awk 'BEGIN{percent+=;} END{print percent}'
0

请比较(也许这就是本意?)

$ df -h | grep 'sda1' | awk 'BEGIN{percent=0;} {percent+=;} END{print percent}'
2

此外,系统 returns 命令的状态,而不是它的输出。 请考虑使用 popen 并从流中读取。

以使用 popen 为例...

#include <stdio.h>
#include <string.h>

#define SIZE 2048

int get_percent_used (const char* devicename);

int main(int argc, char** argv) {
    int qty_used = get_percent_used("/dev/sda1");
    printf ("qty_used = %d percent\n", qty_used);
    return 0;
}

int get_percent_used (const char* devicename)
{
    char buffer[SIZE];
    char command[SIZE];
    FILE* pipe = 0;
    int percent = 0;

    sprintf (command, "df -h | grep '%s' | awk 'BEGIN{percent=0;} {percent+=;} END{print percent}'", devicename);

    if (!(pipe = popen(command, "r"))) {
        perror("open failed");
        return 1;
    }

    while (fgets(buffer, SIZE, pipe) != NULL) {
        percent += (int) strtol(buffer, NULL, 10);
    }
    pclose(pipe);

    return percent;
}