如何将argus的持续输出重定向至C语言编写的处理程序?
实现Argus输出到C程序的实时处理方案
其实这个需求很常见,核心就是利用**管道(pipe)**把两个进程的输入输出串起来,再让你的C程序持续读取并处理每一行数据。下面分步骤给你讲清楚怎么做:
一、Shell层面的管道连接
首先你不需要修改Argus的代码,直接在终端用管道把它的标准输出(stdout)导向你的C程序的标准输入(stdin)就行。如果Argus默认是全缓冲(攒够一定数据才输出),可能会导致你的C程序不能实时拿到数据,这时候可以用stdbuf命令强制Argus行缓冲输出:
stdbuf -oL argus | ./your_c_program
stdbuf -oL:让Argus的stdout使用行缓冲,这样每输出一行就立刻传给管道,而不是攒一堆才输出。./your_c_program:编译好的你的C程序可执行文件。
二、编写处理输入的C程序
你的C程序需要持续从stdin读取每一行,直到Argus进程终止(此时stdin会触发EOF)。这里给你一个基础框架,你可以在里面嵌入自己的测试逻辑:
#include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_LINE_LENGTH 1024 // 根据Argus输出的行长度调整这个值 int main() { char line[MAX_LINE_LENGTH]; // 循环读取每一行,直到Argus终止触发EOF while (fgets(line, sizeof(line), stdin) != NULL) { // 先去掉fgets读进来的换行符 line[strcspn(line, "\n")] = '\0'; // 这里替换成你要执行的一系列测试逻辑 // 示例:打印读取到的行 printf("Received line: %s\n", line); // 示例:检查是否包含特定特征 if (strstr(line, "SYN") != NULL) { printf("* Detected SYN packet flow\n"); } // 其他测试逻辑...比如解析流特征、统计数据等 } // Argus终止后执行收尾工作 printf("Argus process terminated. Exiting.\n"); return EXIT_SUCCESS; }
关键细节说明:
fgets():安全读取一行数据,避免缓冲区溢出,注意要设置足够大的MAX_LINE_LENGTH适配Argus的输出行长度。strcspn(line, "\n"):快速去掉换行符,避免后续处理时带多余的换行标记。- 实时性:只要Argus输出一行,管道就会立刻把数据传给C程序,
fgets会马上读到,处理是实时的。
编译C程序:
用gcc编译即可:
gcc your_program.c -o your_c_program
三、额外优化与注意事项
- 如果Argus的输出行特别长,超过
MAX_LINE_LENGTH,可以用getline()动态分配内存,避免截断数据:
#include <stdio.h> #include <stdlib.h> int main() { char *line = NULL; size_t len = 0; ssize_t read; while ((read = getline(&line, &len, stdin)) != -1) { // 去掉换行符 if (read > 0 && line[read-1] == '\n') { line[read-1] = '\0'; } // 处理逻辑... printf("Received line (length: %zd): %s\n", read, line); } free(line); // 记得释放动态分配的内存 return EXIT_SUCCESS; }
- 如果需要处理Argus的错误输出(stderr),可以把stderr也重定向到管道:
stdbuf -oL argus 2>&1 | ./your_c_program
内容的提问来源于stack exchange,提问作者Oussama Guessoum
相关产品推荐
相关产品推荐

