C 获取system()函数控制台输出的另一种方法
在控制台中执行以下代码时:C 获取system()函数控制台输出的另一种方法,c,linux,gnu,C,Linux,Gnu,在控制台中执行以下代码时: int ret = system("iptables -t filter -L"); ret将获得值1,控制台中将显示一个规则列表。 问题是我还想在程序中获取规则列表。我使用以下解决方案执行此操作: int ret = system("iptables -t filter -L >> filter-table.txt"); /* read filter-table.txt file to get the list */ 还有其他方法可以获取列表吗?正如
int ret = system("iptables -t filter -L");
ret将获得值1,控制台中将显示一个规则列表。
问题是我还想在程序中获取规则列表。我使用以下解决方案执行此操作:
int ret = system("iptables -t filter -L >> filter-table.txt");
/* read filter-table.txt file to get the list */
还有其他方法可以获取列表吗?正如@Charles Duffy和@Kevin所提到的,系统不是您想要的功能。波本更合适。以下几点应该行得通。请注意,如果您使用的是gcc并使用-std=c99标志编译,则需要在包含之前添加define _POSIX_C_SOURCE 2
您应该在发行版上安装iptables-devel,并在代码中直接包含de-library以构建更干净的东西。代替使用输出 您将在此链接上找到提示:
…通过使用popen系列函数而不是system?…严肃地说:如果您想要输出,system是错误的调用。如果您想要对argv解析进行详细控制,或者不受shellshock类型漏洞的影响,那么系统也是错误的选择。我认为,就我个人而言,这很少是正确的选择。system主要用于用shell和概念验证安全漏洞以外的语言编写shell脚本。Libiptc已经不存在了。检查最后一个问题和答案
#include <stdio.h>
#include <error.h>
#define PATH_MAX 1024
int main(void)
{
FILE *fp;
int status;
char path[PATH_MAX];
fp = popen("iptables -t filter -L", "r");
if (fp == NULL)
{
perror("popen");
return -1;
}
while (fgets(path, PATH_MAX, fp) != NULL)
{
printf("%s", path);
/* do something you want with the return data */
}
status = pclose(fp);
if (status == -1)
{
perror("pclose");
}
return 0;
}