获取system()函数的控制台输出的另一种方法

时间:2014-12-09 01:15:45

标签: 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 */

还有其他方法可以获得清单吗?

2 个答案:

答案 0 :(得分:5)

如@Charles Duffy和@Kevin所述,system()不是您想要的功能。 popen()更合适。以下应该有效。请注意,如果您使用gcc并使用-std=c99标记进行编译,则需要在#define _POSIX_C_SOURCE 2之前添加#include <stdio.h>

#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;
}

答案 1 :(得分:2)

您应该在发行版上安装iptables-devel,并在代码中直接包含de library以构建更清晰的东西。代替使用输出。

您将在此链接上找到提示: http://www.bani.com.br/2012/05/programmatically-managing-iptables-rules-in-c-iptc/