从 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;
}
我的问题很简单:
我正在用 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;
}