unix:main()交互式,命令行,管道和在C中重定向?

时间:2016-04-19 15:43:50

标签: c unix command-line

使用 main()<可以轻松使用文件重定向管道,以及交互式用户输入阅读/ em> ,如此C代码段所示......

main()

...我不确定是否有一种现代的UNIX源码兼容且易于以编程方式实现 C #define SIZ 1024 #include <stdio.h> #include <stdlib.h> extern void do_something_with_the_array(float *, int); int main(int argc, const char * argv[]) { float f[SIZ]; int k = 0; if(argc > 2){ for(k = 0; k < argc - 1; k++) f[k] = (float)atof(argv[k+1]); } else while ((scanf("%f", &f[k]) == 1)&&(k < SIZ)) k++; do_something_with_the_array(f, k); return 0; } 的三种可能性中的任何一种,具体取决于上下文?

  • 将一串数字作为用户输入进行交互式阅读
  • 读取与命令行参数相同的数字串
  • 文件重定向和管道

我理解管道和重定向“属于”shell,它在程序开始执行之前拦截程序,而命令行参数和交互式阅读“属于” main() < / strong>本身,因此可能没有一种简单的方法可以做到这一点。

我看到使用 stdin 文件输入或管道输入非常明显。但是,阅读命令行参数是一个不同的故事。这是一个演示我通常如何编码的演示,但它看起来有点笨拙并且被黑客入侵。此外,在更复杂的选项场景中,这可能会成为一个相当混乱的代码。我也不确定这是多么安全或傻瓜证明......

{{1}}

提前致谢!

2 个答案:

答案 0 :(得分:1)

我不知道C库的副作用会使你提到的三个具体案例看起来一样(虽然有人这样做,请回答,因为我也想知道!)。我认为您正在寻找与the diamond <> operator in Perl不同的东西,但是对于单个参数而不是包含参数的文件。

我认为@David Hoelzer有正确的想法:分别处理这三个案例。例如,在处理命令行或文件参数时,不要生成&#34;输入值&#34;提示您可以打印以进行交互式输入。对于命令行处理,getopt是一个很好的起点。

现在,对您来说是一个挑战:将这三个操作包装在库中并使其成为开源的,这样我们其他人就可以受益! :)

答案 1 :(得分:1)

如果用键盘输入和文件输入调用它们,包括shell本身,很多程序都会关注它们。

让我们以/ bin / sh作为我们的第一个例子。如果你直接调用它,它会启动一个交互式shell,但如果你把一些东西输入它,它就会以非交互式阅读shell的形式出现。两者之间的主要区别在于,如果它不是交互式的,则不会显示$提示符。但是,如果它确实是交互式的,可以使用-i选项启动它,使其在通常决定的情况下假设它是交互式的。

这里涉及的魔力是isatty();见man 3 isatty

此外,有些程序喜欢在处理重定向标准输入时接收键盘输入。这有两种普遍受欢迎的方式;打开和读取/dev/tty或读取标准错误,具体取决于上下文。交互式启动管道中的大多数内容没有重定向的标准错误,因此这往往效果很好(读取重定向的标准错误会立即产生错误,因为句柄未打开以进行读取)。如果您想使其完全可自动化,请阅读标准错误,否则请阅读/dev/tty