You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:26:08