Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 获取system()函数控制台输出的另一种方法_C_Linux_Gnu - Fatal编程技术网

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