Linux中所谓的标准流是指stdin、stdout和stderr。但它们必须被称为“标准”是有原因的。**是否存在非标准流?**这些非标准流是否被内核从根本上区别对待?
t5zmwmid1#
标准流只是在新进程中启动新程序时通常打开的流。
进程可能会打开其他流,无论是到常规文件、设备(或伪设备)、网络连接或您拥有的任何东西。对于操作系统内核来说,进程打开的其他流与标准流没有根本区别。
当外壳执行命令时,外壳负责设置标准流,因为它创建新进程并开始执行程序。它通过打开流或以其他方式使用流的普通系统调用来实现这一点。如果您编写自己的程序来创建新进程,它可能会以不同于标准的方式配置流,并且操作系统不会在意。
Linux是Unix-like,The Single Unix Specification有一节“stderr、stdin、stdout-标准I/O流”,其中说:…在程序启动时,应预先定义三个流,不需要显式打开:标准输入(用于读取常规输入)、标准输出(用于写入常规输出)和标准误差(用于写入诊断输出)…
r1zhe5dt2#
在Unix思想中,所有内容都应该是文件或目录。这就是为什么您可以在/dev中看到您的设备,或者在/proc中看到您正在运行的进程。根据实现或发行版的不同,也有一些例外。但是,所有你可以“触摸”或认为是“事物”的东西都通常由一个文件表示
正如JayC667所说,流只是一个字节序列,最终只是一个文件。例如,您可以打开一个文件(使用fopen),然后使用fprint tf写入新打开的流。还有许多其他非标准流的示例,它们通常都包含文件处理程序,对于标准流,stdin的文件处理程序为0,stdout为1,stderr为2;这些都不会改变。使用WRITE(),您可以使用这些ID来写入任何流,尽管因为只有这三个是标准的,所以除了这三个之外,您通常不会硬编码任何数字(通常有一些例外)。
另一件可以帮助您理解这个概念的事情是,如果您是在Linux上,您可以执行ps -ef | grep <program>,然后转到/proc//fd来查看打开的文件描述符。实际上,您会发现前两个标准文件描述符(stdin和stdout)以及其他“非标准”描述符
ps -ef | grep <program>
2条答案
按热度按时间t5zmwmid1#
标准流只是在新进程中启动新程序时通常打开的流。
进程可能会打开其他流,无论是到常规文件、设备(或伪设备)、网络连接或您拥有的任何东西。对于操作系统内核来说,进程打开的其他流与标准流没有根本区别。
当外壳执行命令时,外壳负责设置标准流,因为它创建新进程并开始执行程序。它通过打开流或以其他方式使用流的普通系统调用来实现这一点。如果您编写自己的程序来创建新进程,它可能会以不同于标准的方式配置流,并且操作系统不会在意。
Linux是Unix-like,The Single Unix Specification有一节“stderr、stdin、stdout-标准I/O流”,其中说:
…在程序启动时,应预先定义三个流,不需要显式打开:标准输入(用于读取常规输入)、标准输出(用于写入常规输出)和标准误差(用于写入诊断输出)…
r1zhe5dt2#
在Unix思想中,所有内容都应该是文件或目录。这就是为什么您可以在/dev中看到您的设备,或者在/proc中看到您正在运行的进程。根据实现或发行版的不同,也有一些例外。但是,所有你可以“触摸”或认为是“事物”的东西都通常由一个文件表示
正如JayC667所说,流只是一个字节序列,最终只是一个文件。例如,您可以打开一个文件(使用fopen),然后使用fprint tf写入新打开的流。还有许多其他非标准流的示例,它们通常都包含文件处理程序,对于标准流,stdin的文件处理程序为0,stdout为1,stderr为2;这些都不会改变。使用WRITE(),您可以使用这些ID来写入任何流,尽管因为只有这三个是标准的,所以除了这三个之外,您通常不会硬编码任何数字(通常有一些例外)。
另一件可以帮助您理解这个概念的事情是,如果您是在Linux上,您可以执行
ps -ef | grep <program>
,然后转到/proc//fd来查看打开的文件描述符。实际上,您会发现前两个标准文件描述符(stdin和stdout)以及其他“非标准”描述符