认清Linux中标准输入和标准输出的双重含义
按照惯例,UNIX系统shell使用文件描述符0与进程的标准输入(一般是键盘)相关联,文件描述符1与标准输出(一般是显示器)相关联,文件描述符2与标准出错输出(一般是显示器)相关联。
在依从POSIX的应用程序中,幻数0、1、2应当替换成符号常量STDIN_FILENO、STDOUT_FILENO和STDERR_FILENO。这些常量都定义在头文件<unistd.h>中。
一般在教材中不会明确区分,但是我们应注意到标准输入有两层含义:一是指STDIN_FILENO(惯例指定的标准输入设备描述符);另一层含义则是指标准输入设备(如键盘)。同样,标准输出也有两层含义:一是指STDOUT_FILENO(惯例指定的标准输出设备描述符);另一层含义则是指标准输出设备(如显示器)。
scanf函数从标准输入读取内容,我们通常会认为是从键盘读取的。printf函数把内容输出到标准输出,我们通常认为是输出到显示器上。这并没有问题,但前提是“在通常情况下”。
精确地说,scanf函数是从文件描述符STDIN_FILENO(0)所关联的文件中读取,而prinf函数则是输出到文件描述符STDOUT_FILENO(1)所关联的文件中。
如果STDIN_FILENO关联的文件不是键盘,那么scanf就不会从键盘读取内容,同理,如果STDOUT_FILENO关联的文件不是显示器,那么printf也不会将内容输出到显示器。
举例说明(不深究此程序片段意义如何,只为说明上面的叙述而用):
...
int fd[2];
int pid; pipe(fd); if((pid = fork()) < 0)
{
perror("fork");
exit(1);
}
else if(pid == 0) /* 子进程 */
{
close(fd[0]);
dup2(fd[1], STDOUT_FILENO);
...
}
else /* 父进程 */
{
close(fd[1]);
dup2(fd[0], STDIN_FILENO);
...
}
子进程中,如果在dup2(fd[1], STDOUT_FILENO); 语句后调用printf函数,那么内容并不会输出到显示器,而是写入了管道中。
父进程中,如果在dup2(fd[0], STDIN_FILENO); 语句后调用scanf函数,那么不会从键盘读取内容,而是从管道中读取。
清楚地了解标准输入和标准输出在特定上下文中的确切含义,有时可以避免不必要的困扰。
认清Linux中标准输入和标准输出的双重含义的更多相关文章
- Linux shell标准输入,标准输出,错误输出
shell中可能经常能看到:1>/dev/null 2>&1 eg:sudo kill -9 `ps -elf |grep -v grep|grep $1|awk '{prin ...
- Linux中变量#,@,0,1,2,*,$$,$?的含义
$# 是传给脚本的参数个数 $ 是脚本本身的名字 $ 是传递给该shell脚本的第一个参数 $ 是传递给该shell脚本的第二个参数 $@ 是传给脚本的所有参数的列表 $* 是以一个单字符串显示所有向 ...
- Linux中变量$#,$@,$0,$1,$2,$*,$$,$?的含义(转载)
From:http://dadekey.blog.51cto.com/107327/119938 我们先写一个简单的脚本,执行以后再解释各个变量的意义 # touch variable # vi ...
- 【转】Linux中变量$#,$@,$0,$1,$2,$*,$$,$?的含义
原文网址:http://dadekey.blog.51cto.com/107327/119938 我们先写一个简单的脚本,执行以后再解释各个变量的意义 # touch variable # vi ...
- [转帖]Linux的标准输入 标准输出和错误输出
Linux标准输入.输出和错误和文件重定向 专题 https://www.cnblogs.com/softidea/p/3965093.html 感觉自己对 这一块的理解一直不好 昨天同事给了一个 b ...
- linux中Shell标准输出错误 >/dev/null 2>&1 分析【转】
Shell中可能经常能看到:>/dev/null 2>&1 eg:sudo kill -9 `ps -elf |grep -v grep|grep $1|awk '{print ...
- linux中的标准输出和输入
===============1.有些人经常问我这个问题问题=========== 经常在脚本里面看到这个 2>&1 表示什么意思啊? ==============2.理论 ...
- Linux标准输入、标准输出、错误输出
Linux中的输入文件.输出文件.错误输出 文件名称 文件描述符 标准输入 0 (默认是键盘) 标准输出 1 (默认是屏幕) 标准错误 2 (默认是屏幕) 输出重定向 Linux中&表示后台运 ...
- Linux - 标准输入转换为标准输出 代码(C)
标准输入转换为标准输出 代码(C) 本文地址:http://blog.csdn.net/caroline_wendy Linux能够使用getc()和putc(),读取和写入每个输入字符. 代码: / ...
随机推荐
- MyEclipse2015对Javascript自动提示的终极支持
2015通过集成Tern.js,进入了JS自动提示的最新时代 先看看具体效果吧: 点击链接会进入: 而tern.js已经支持相当多的框架: 关键这个提示不只是纯粹的js文件,对于jsp等等 ...
- iOS 获取通讯录权限的时机
建议将获取通讯录权限的代码放到 -(void)viewDidAppear:(BOOL)animated 或 -(void)viewWillAppear:(BOOL)animated 假如放在 view ...
- cocos2d-html5将js编译为jsc
在d:\DevTool\cocos2d-x-2.2.2\cocos2d-x-2.2.2\tools\cocos2d-console\console 有 cocos2d_jscompile.py coc ...
- 第三百二十三天 how can I 坚持
人在最绝望的时候会干啥,<进击的巨人>. 可以绝望,但一定要相信还有希望. 今天去看了<美人鱼>,确实挺好吧. 把愤怒归结于无能,其实是大错特错,愤怒是人的情绪的发泄,是人就有 ...
- JVM系列四:生产环境参数实例及分析【生产环境实例增加中】
java application项目(非web项目) 改进前: -Xms128m-Xmx128m-XX:NewSize=64m-XX:PermSize=64m-XX:+UseConcMarkSweep ...
- [转]模拟HttpContext 实现ASP.NET MVC 的单元测试
众所周知 ASP.NET MVC 的一个显著优势即可以很方便的实现单元测试,但在我们测试过程中经常要用到HttpContext,而默认情况下单元测试框架是不提供HttpContext的模拟的,本文通过 ...
- USB -- BULK_ONLY和UFI协议
2 BULK_ONLY和UFI协议 Bulk—Only协议是USB组织针对大容量存储设备制定的一种块存储类协议,目前已经普遍应用于各种移动存储设备. USB设备分为5大类,即显示器.通信设备.音频设备 ...
- hdu 2819 Swap
Swap http://acm.hdu.edu.cn/showproblem.php?pid=2819 Special Judge Problem Description Given an N*N m ...
- Holding Bin-Laden Captive!_hdu_1085(DP).java
/* * 9607741 2013-11-17 18:04:23 Accepted 1085 187MS 5700K 1251 B Java zhangyi http://acm.hdu.edu. ...
- [ASP.NET]更简单的方法:FormsAuthentication登录ReturnUrl使用绝对路径
转自:http://www.cnblogs.com/dudu/p/formsauthentication-returnurl-absoluteuri.html [ASP.NET]更简单的方法:Form ...