我希望能够做到这一点:

$ echo "hello world" | ./my-c-program
piped input: >>hello world<<

我知道 isatty should be used可以检测stdin是否是tty。如果不是tty,我想读出管道内容-在上面的示例中,这是字符串hello world

在C中推荐这样做的推荐方式是什么?

这是到目前为止我得到的:
#include <stdio.h>
#include <unistd.h>

int main(int argc, char* argv[]) {

  if (!isatty(fileno(stdin))) {
    int i = 0;
    char pipe[65536];
    while(-1 != (pipe[i++] = getchar()));
    fprintf(stdout, "piped content: >>%s<<\n", pipe);
  }

}

我使用以下代码进行编译:
gcc -o my-c-program my-c-program.c

它几乎可以正常工作,除了它似乎总是在管道内容字符串的末尾添加U + FFFD REPLACEMENT CHARACTER和换行符(尽管我确实理解换行符)。为什么会发生这种情况,如何避免这个问题?
echo "hello world" | ./my-c-program
piped content: >>hello world
�<<

免责声明:我对C没有任何经验。请对我好一点。

最佳答案

因为您忘记了NUL终止字符串,所以显示了替换符号。

出现换行符是因为默认情况下,echo在其输出末尾插入'\n'

如果您不想插入'\n',请使用以下命令:

echo -n "test" | ./my-c-program

并删除错误的字符插入
pipe[i-1] = '\0';

在打印文本之前。

请注意,由于实现循环测试的方式,您需要将i-1用作空字符。在您的代码中,i在最后一个字符之后再次增加。

关于c - 如何在C中读取管道内容?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16305971/

10-10 17:51