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

如何编写支持Shell管道输入(含单横线语法)的Linux C程序

实现支持-参数读取标准输入的Linux C程序

核心误区纠正

你查到的pipe()函数是用于进程内部创建管道通信的(比如父子进程间传递数据),但你要实现的是读取外部管道传入的标准输入,完全不需要调用pipe(),只需要处理标准输入(stdin)即可。

实现逻辑

像pacman -S -这种用法,本质是程序的一个约定:当命令行参数为-时,不从指定文件读取数据,而是从**标准输入(stdin)**读取内容。你的程序只需要完成两步:

  • 遍历命令行参数,检查是否存在-这个特殊参数;
  • 若遇到-,则从stdin读取并处理数据;若为普通参数,则按常规逻辑处理。

代码示例

下面是一个简单的实现,模拟类似pacman接收输入并处理的逻辑:

#include <stdio.h>
#include <string.h>
#include <unistd.h> // 可选,用于isatty判断

#define BUFFER_SIZE 256

// 通用处理函数,可替换为你的实际业务逻辑(比如安装包、文本处理等)
void process_item(const char *item) {
    printf("Processing: %s\n", item);
}

void process_input_stream(FILE *stream) {
    char buffer[BUFFER_SIZE];
    while (fgets(buffer, BUFFER_SIZE, stream) != NULL) {
        // 去除换行符(兼容\n或\r\n)
        buffer[strcspn(buffer, "\n\r")] = '\0';
        // 跳过空行
        if (strlen(buffer) == 0) continue;
        process_item(buffer);
    }
}

int main(int argc, char *argv[]) {
    // 无参数时默认读取stdin(可选,类似cat的行为)
    if (argc == 1) {
        process_input_stream(stdin);
        return 0;
    }

    // 遍历命令行参数
    for (int i = 1; i < argc; i++) {
        if (strcmp(argv[i], "-") == 0) {
            // 处理标准输入
            process_input_stream(stdin);
        } else {
            // 处理普通参数
            process_item(argv[i]);
        }
    }

    return 0;
}

编译与测试

  1. 编译:gcc -o myapp myapp.c
  2. 测试管道输入:echo "neofetch htop" | ./myapp -
  3. 测试普通参数:./myapp firefox
  4. 测试终端输入(无参数时):./myapp,输入内容后按Ctrl+D结束输入。

可选优化:判断输入是否为管道

如果需要避免终端下无意义等待,可以用isatty(STDIN_FILENO)判断输入是否来自终端:

// 在处理stdin前添加判断
if (isatty(STDIN_FILENO)) {
    fprintf(stderr, "Error: No input provided via pipe or file\n");
    return 1;
}

内容的提问来源于stack exchange,提问作者Tulen662

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 14:09:55