天天看点

linux标准输入输出

通常linux程序启动后都会有这3个打开的输入输出流,叫标准I/O流。

对应的文件描述符为<code>STDIN_FILENO(0),STDOUT_FILENO(1),STDERR_FILENO(2)</code>。

文件描述符是内核的,文件句柄<code>FILE</code> 是库对文件描述符的封装,子进程可以继承文件描述符,但不继承文件句柄。

通常 <code>stdin,stdout,stderr</code> 用宏来实现的,对它们直接赋值不具有可移植性,标准做法是通过<code>freopen(3)</code>来重新打开。

stderr无缓冲,stdout是行缓冲

控制终端 controlling terminal

/dev/tty 是一个进程的控制终端

nohup

让程序不受 hangups 信号影响,输出到non-tty

如果标准输入是终端,就重定向到 /dev/null。如果标准输出是终端,就重定向到 nohup.out 文件。标准错误重定向到标准输出。

要将输出保存到文件,用 "nohup COMAND &gt; FILE"

shell重定向

命令执行前,输入和输出可以用shell特定的符号重定向。

从左到右按顺序执行重定向, <code>ls &gt; dirlist 2&gt;&amp;1</code> 会将标准输出和标准错误都重定向到文件 "dirlist" 中, <code>ls 2&gt;&amp;1 &gt; dirlist</code> 只会将标准输出重定向到文件中。

如果重定向符号前不是文件描述符,而是一个变量名,shell会申请一个大于10的文件描述符给这个变量名。如果是 <code>&gt;&amp;- 或 &lt;&amp;-</code> 之前有变量,表示的是要关闭的文件描述符

如果忽略文件描述符,<code>&lt;</code> 符号之前表示省略标准输入,<code>&gt;</code> 符号之前表示省略标准输出。

使用大于9的文件描述符要小心,可能会跟shell内部使用的冲突

重定向输入,<code>[n]&lt;word</code>,在文件描述符n上打开<code>word</code>表示的文件来读取。没有n,表示打开到标准输入

重定向输出,<code>[n]&gt;word</code>,在文件描述符n上打开<code>word</code>表示的文件来写入。没有n,表示打开标准输出到文件 <code>word</code>

重定向追加,<code>[n]&gt;&gt;word</code>

重定向标准输出和标准错误,两种格式: <code>&amp;&gt;word</code>, 或者 <code>&gt;&amp;word</code>,推荐前一个,跟 <code>&gt;word 2&gt;&amp;1</code> 的作用一样

重定向追加标准输出和标准错误, <code>&amp;&gt;&gt;word</code>, 跟 <code>&gt;&gt;word 2&gt;&amp;1</code> 的作用一样

复制文件描述符,<code>[n]&lt;&amp;word</code>,复制输入文件描述符,在文件描述符 <code>n</code> 上复制文件<code>word</code>。如果 <code>word</code> 是 <code>-</code>,表示要关闭 n。 <code>[n]&gt;&amp;word</code>表示在文件描述符<code>n</code>上复制输出文件<code>word</code>。比如<code>2&gt;&amp;1</code>表示关闭2,并将1复制到2上,复制的意思是,2跟1一样,现在都指向1对应的标准输出。不管是输入还是输出,最终目标都指向后一个文件。比如 <code>2&gt;&amp;1</code>,最后都指向1,表示2也指向1,程序对2的输出,也输出到1。

移动文件描述符,<code>[n]&lt;&amp;digit-</code>,表示移动digit到文件描述符n。移动后,digit文件会被关闭,n表示之前打开的文件。<code>[n]&gt;digit-</code>也一样

打开文件描述符来读写,<code>[n]&lt;&gt;word</code>,用描述符n打开文件来读写,省略n表示用标准输入。

here document, <code>&lt;&lt; delimiter \n document \n delimite</code>

参考:

man 3 stdin

继续阅读