查看长时间运行的程序的输出
如果我们有一个程序,那个程序运行很长的时间,我们可以在任何一种标准的shell下面将这个程序简单地放到后台运行。但是,如果我们将这个程序的标准输出重新定向到一个文件中的时候,或者它并不产生许多输出的时候,我们无法方便地检测这个进程,因为标准输入输出库对它的标准输出设置成为了满缓存(标准输出被重新定向成了一个文件,而根据前面,一个文件被标准输入输出库读写的时候会被首先设置成满缓冲的形式)。 我们所能够看到的只是标准输入输出库将成块的输出写到文件中去,可能每块数据的大小达到8,192字节。
如果我们有源代码,我们可以插入fflush调用。另外,我们可以通过pty程序运行这个程序,这样让标准输入输出库以为它的标准输出是一个终端(这样就不会成为满缓冲了)。下面的图形就展示了这个结构,我们将它称为慢输出程序。fork/exec箭头从login shell指向pty进程,箭头是虚线的,用来强调pty进程运行在后台作业当中。
通过伪终端运行慢输出程序
+-------------+
| output file |
+------^------+
|
+----------+ +------|------+ +----------+
| login | fork | pty | fork | slow out |
| shell |- - - - - -> process |---------->| |
+--|----^--+ exec +--|-----^----+ exec +--|-----^-+
| | | | stdout| |stdin
| | | | stderr| |
+- - - -|- - |- - - - - - - - -|- - -|- - - - - - - - - -|- - -|- - - -+
| +---v----|------+ | | +----v-----|----+ |
| terminal | | | | terminal |
| |line discipline| | | |line discipline| |
+---|----^------+ | | +----|-----^----+
| | | | | | | |
| | | | | | kernel
| +---v----|------+ +--v-----|----+ +--v-----|--+ |
| terminal | | PTY | | PTY |
| | device driver | | master | | slave | |
+------^--------+ +--|-----^----+ +--|-----^--+
| | | | v | |
| v +<------------------+ |
| | +------------------------------>+ |
+ - - - - -|- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -+
v
/---------\
| user at a |
| terminal |
\---------/
网友评论