恐怕你的理解完全是倒退的。:)
程序的 角度而不是内核的角度来 考虑“标准输入”、“标准输出”和“标准错误”
当程序需要打印输出时,它通常会打印到“标准输出”。程序通常使用 将输出打印到标准输出 printf
,它仅打印到标准输出。
当程序需要打印错误信息(不一定是异常,异常是编程语言构造,强加在更高级别)时,它通常会打印到“标准错误”。它通常使用 来执行此操作 fprintf
或 fopen
打开的任何其他文件 fdopen
.
当文件需要读取输入时,使用 \'standard in\',使用 fread
或 fgets
或 getchar
.
任何这些文件都可以很容易地 从 shell 重定向
cat /etc/passwd > /tmp/out # redirect cat's standard out to /tmp/foo
cat /nonexistant 2> /tmp/err # redirect cat's standard error to /tmp/error
cat < /etc/passwd # redirect cat's standard input to /etc/passwd
或者,整个玉米卷饼:
cat < /etc/passwd > /tmp/out 2> /tmp/err
有两个重要的注意事项:首先,“标准输入”、“标准输出”和“标准错误”只是一种惯例。它们是一种 非常强大的 惯例,但这只是一种协议,即能够像这样运行程序非常好: grep echo /etc/services | awk '{print $2;}' | sort
并将每个程序的标准输出挂接到管道中下一个程序的标准输入中。
其次,我给出了用于处理文件流( FILE *
对象)的标准 ISO C 函数——在内核级别,它是所有文件描述符( int
对文件表的引用)和许多低级操作(如 read
和) write
,它们不能像 ISO C 函数那样进行愉快的缓冲。我想保持简单并使用更简单的函数,但我认为您应该知道替代方案。:)