文件描述符stdin,stdout,stderr,重定向

Linux Shell 文件描述符stdin,stdout,stderr,重定向

系统保留的三个文件描述符分类

0 标准输入 stdin		/dev/stdin
1 标准输出 stdout 	/dev/stdout
2 标准错误 stderr	/dev/stderr

另外,当一个用户进程被创建的时候,系统会自动为该进程创建三个文件描述符0,1,2,对应的就是 stdin, stdout, stderr。当进程结束后,进程编号对应的目录将被清理。

ps -ef |grep php // 找到要查看的进程号,比如 9876
cd /proc/9876/fd
ll

在这里插入图片描述
pts/0 表示会话编号,以及输入和输出在那个会话上展示。

stdout 和 stderr 都是输出到屏幕,他们的区别在于 stdout是有缓冲的,而stderr是无缓冲的,会直接输出。

对文件描述符进行重定位(重定位运算符)

>  替换原有内容
>> 内容追加到末尾
重定位运算符 ">" ">>" 的默认参数为标准输出 stdout ,即 1 ;也就是说 >>> 默认只接收 stdout 。
所以 ">" 等价于 "1>"; ">>" 等价于 "1>>",也就是说 ls > out.log 就是 ls 1> out.log 
注意 1和>之间不能有空格,使用数字来重定向都不能有空格。

解释:
(0)、何为标准输入和标砖输出

标准输入: /dev/stdin 文件里面的数据
标准输出: /dev/stdout 文件里面的数据

(1)、当我们输入“输出指令”,例如 ls, echo 等返回的信息归为stdout;

比如:
ls > out.log
cat out.log
有内容

比如:
ls + > out2.log
ls: 无法访问+: 没有那个文件或目录
cat out2.log
空的,为什么呢?那显然返回的内容不是stdout,而是stderr,我们可以使用 $? 获取最后一条命令执行的返回值,
当返回值为零代表命令执行成功。
ls + > out2.log
echo $?
2
那么我们可不可以把标准错误重定向到标准输出呢,答案是可以的,2>&1 一般写在后面,表示如果出错了就重定向,
作为一种补救措施,毕竟谁也不能预知错误。
ls + > out3.log 2>&1
cat out3.log
ls: 无法访问+: 没有那个文件或目录

或者使用 &>
ls + &> out3.log

(2)、可以同时重定向stdout与stderr到指定的文件

cat out*.log 2>stderr.txt 1>stdout.txt

(3)、将stderr/stdout重定向到无底洞 /dev/null

ls + > /dev/null 2>&1
如果命令执行成功则将 stdout 定向到 /dev/null ,如果执行失败,则将 stderr 定向到 stdout 然后 
stdout 定向到 /dev/null
### C语言中 `fprintf`、`printf`、`stdin`、`stdout` 和 `stderr` 的用法及区别 #### 函数与宏定义概述 在C语言编程环境中,`stdin`, `stdout`, `stderr` 是预定义的标准I/O流文件指针。这些文件指针对应着程序运行时默认连接至终端设备的三个标准通道:标准输入(通常是键盘)、标准输出(通常是指向屏幕)和标准错误输出(同样指向屏幕但专用于显示错误信息)。当操作系统启动一个进程时会自动创建这三个文件描述符并赋予特定编号——0对应`stdin`;1对应`stdout`; 2则分配给`stderr`。 对于输出操作而言: - **`printf()`** 函数可以看作是对 `stdout` 进行写入的一种便捷方式[^1]。其功能上等价于调用带有第一个参数设定为 `stdout` 的 `fprintf()` 函数。 - **`fprintf()`** 则是一个更为通用的形式化输出函数,允许指定任意有效的FILE * 类型的目标作为输出目的地,并支持格式化的字符串打印[^3]。 而对于错误消息处理方面有专门设计用来向 `stderr` 发送数据的方法: - 使用 perror() 可以方便地将当前线程最后一次发生的系统级错误转换成人类可读的信息并通过 `stderr` 显示出来,这实际上也是通过内部调用了类似于 `fprintf(stderr,"...")` 的机制实现。 关于缓冲特性上的差异值得注意的是: - 默认情况下,`stdout` 流采用行缓存模式工作,在接收到换行字符(`'\n'`)之前不会立即将待发送的数据刷新到实际目标位置除非显式执行了 `fflush(stdout)` 或者遇到了程序结束等情况触发强制刷盘动作; - 相较之下,为了确保异常情况能够被及时发现,`stderr` 设计成了无缓存状态,任何尝试往里面写入的内容都会立刻呈现给用户查看而不必等待额外条件满足后再做统一提交[^2]。 下面给出一段简单的示范代码来展示上述概念的实际应用效果: ```c #include <stdio.h> int main(void){ char str[]="Hello World!"; // 向标准输出打印一条带格式的消息 printf("%s\n",str); // 将相同内容再次发往 stdout ,形式略有不同而已 fprintf(stdout,"%s (via stdout)\n",str); // 假设发生某种错误状况,则可通过如下方法记录下来 fprintf(stderr,"Error occurred while processing %s (via stderr).\n",str); return 0; } ``` 此段代码先利用 `printf()` 打印了一条问候语句,接着又借助 `fprintf()` 对同一句话进行了重复输出只不过这次明确指定了流向为 `stdout` 。最后模拟了一个可能出现的错误场景并将相应提示经由 `stderr` 渠道传达出去以便引起注意。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值