fflush a stream

清洗一个流

clip_image002

      前面说过,对于用户缓冲虽然有很大的好处,但是也有一定的风险,就是断电后可能会有数据尚未写入磁盘,导致数据丢失。

      标准IO提供了一个用来将用户缓冲区写入内核,并且保证所有的数据都通过write写出的函数,fflush函数提供了这一功能。

      调用fflush以后,立即调用fsync,就可以先保证用户缓冲区被写入内核,然后保证内核缓冲区被写入到磁盘。

     其实,对于有些输入,由于缓冲的影响,可能会导致stdout暂时看不到,此时就可以通过fflush(stdout)来立即查看。fflush(stdin)刷新标准输入缓冲区,把输入缓冲区里的东西丢弃,fflush(stdout)刷新标准输出缓冲区,把输出缓冲区里的东西打印到标准输出设备上,比如printf(“。。。。。。。。。。。“);后面加fflush(stdout);可提高打印效率

 

显示数据

显示数据

12.1 了解输入和输出

12.1.1 标准文件描述符

       每个进程最多可以有9个打开文件的描述符。其中bash shell为特殊需要保留了前3个文件描述符012

       Linux标准文件描述符

文件描述符

缩写

描述

0

STDIN

标准输入

1

STDOUT

标准输出

2

STDERR

标准错误

比如ls –al test test1 test3 2> errorfile 1> outfile,将会把错误信息发送到errorfile文件中,输出信息发送到outfile文件中。当然也可以使用&>将所有信息发送到一个文件中。

12.2 在脚本中重定向输出

12.2.1 临时重定向

       在文件描述符编号前面加上&号,可以重定向到该文件描述符。例如:

echo “This is an error message” >&2

       我们可以看到输出到2的与STDOUT的没有什么区别,但是如果我们使用./test 2> errorfile就可以把错误消息发送到errorfile而只是输出STDOUT的信息。

12.2.2 永久重定向

exec 1> testout

exec 2>errorout

 

echo hello

echo world

echo error info >&2

此时执行就可以把所有的输出定向到testout中,因为exec命令为启动一个新的shell,并将STDOUT文件描述符重定向到一个文件,所有定向到STDOUT的脚本输出都将重定向到这个文件。而错误信息就会重定向到errorout中。

12.3 在脚本中重定向输入

       使用exec 0< testfile即可从文件testfile而不是STDIN中获取输入。

12.4 创建自己的重定向

创建读取/写入文件描述符

exec 3<>testfile

12.4.5 关闭文件描述符

exec 3>&-

12.5 列出开放文件描述符

       命令lsof列出整个linux系统上所有的开放文件描述符。

12.6 禁止命令输出

       有事不希望显示任何脚本输出,可以将STDERR重定向到成为空文件null file的特殊文件/dev/null中,任何重定向到该位置的数据都将丢失且不会显示。

       例如ls –al > /dev/null将不显示任何信息。

12.7 使用临时文件

       Linux使用/tmp目录处理不需要永久保存的文件。

12.8 记录消息

       使用命令tee可以不用使用两次重定向而将输出同时发送到监视器和日志文件。

       例如$date | tee testfile

重定向

重定向

标准输入,输出和错误

—————————————————–

文件文件                描述符

—————————————————–

输入文件       —标准输入            0

输出文件       —标准输出            1

错误输出文件—标准错误               2

—————————————————–

标准重定向

重定向操作符  > ,可以将标准输出重定向到另一个文件中,而不是显示在屏幕上。如果>不添加任何命令,那么将会删除一个文件的内容。如果不想覆盖原来的内容可以使用>>来追加操作。

将标准输出和标准错误重定向到同一个文件

&>可以把标准输出和标准错误重定向到同一个文件

管道

使用管道|可以把一个命令的标准输出传送到另一个命令的标准输入中。

其他一些命令

l  报告或忽略文件重复的行 uniq

l  打印行数、字数和字节数 wc

l  打印匹配行grep

l  打印文件开头/结尾 head/tail

l  从标准输入读取数据,并同时输出到stdout和文件中 tee