我对这三个文件的用途感到很困惑。如果我的理解正确的话,stdin 是程序写入其在进程中运行任务的请求的文件,stdout 是...
我对这三个文件的用途感到困惑。如果我的理解正确,它们 stdin
是程序写入其在进程中运行任务的请求的文件、 stdout
内核写入其输出以及请求它的进程从中访问信息的文件、以及 stderr
所有异常都输入到的文件。打开这些文件以检查这些是否确实发生,我发现似乎没有任何迹象表明如此!
我想知道的是这些文件到底有什么用途,用很少的技术术语来给出绝对简化的答案!
恐怕你的理解完全是倒退的。:)
程序的 角度而不是内核的角度来 考虑“标准输入”、“标准输出”和“标准错误”
当程序需要打印输出时,它通常会打印到“标准输出”。程序通常使用 将输出打印到标准输出 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 函数那样进行愉快的缓冲。我想保持简单并使用更简单的函数,但我认为您应该知道替代方案。:)